android - 使用反射为私有方法编写测试
问题描述
我有一堂课是NetworkManager
。我有很多private
方法,我真的需要为它们编写测试。
起初我没有找到任何解决方案来为我的私有方法编写测试。无论如何,我找到了一种访问我的私有方法并为它们编写一些测试的方法。
我使用反射来访问我的函数并为它们编写测试。有一个简单的私有方法的例子:
private String myFun (String input){
return input+"hello";
}
有一个测试类,我在其中使用了反射:
@RunWith(AndroidJUnit4.class)
public class NetworkManagerTest {
private static NetworkManager networkManager;
private Context appContext = InstrumentationRegistry.getTargetContext();
private @ADType
int adType = ADType.TYPE_BANNER;
@BeforeClass
public static void setup() {
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
networkManager = NetworkManager.getInstance();
networkManager.addNetworkCall(TestUtil.getSampleSystemRequest());
}
});
}
@Test
public void sample() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method method = NetworkManager.class.getDeclaredMethod("myFun", String.class);
method.setAccessible(true);
String output = (String) method.invoke(networkManager, "Ehsan");
Assert.assertEquals("Ehsanhello", output);
}
}
这很好用。但问题是这种方式可以为使用反射的私有方法编写测试多少?
有没有更好的方法来实现这个目标?
解决方案
但问题是这种方式可以为使用反射的私有方法编写测试多少?
有没有更好的方法来实现这个目标?
最常见的方法是放弃该目标。
从历史上看,TDD 的重点一直是验证行为,而不是实现细节。部分原因是测试让我们可以自信地更改代码的内部设计,因为测试会提醒我们任何意外的行为变化。
因此,如果我们需要一个测试来确保某些私有方法中的逻辑是正确的,我们会找到一个依赖于该逻辑的公共 API 的用例,并编写测量公共 API 行为的测试。
我们可以通过将临时故障注入私有方法并验证测试是否检测到故障来校准测试。
完成后,我们可以选择通过内联私有方法来重构代码;在这种情况下,所有测试都应该通过,因为我们没有改变测试对象的行为——我们只是移动了细节。
如果您要积极努力改进应用程序的内部设计,那么您需要与该内部设计分离的测试。
推荐阅读
- c - C - How to resolve a segmentation fault while freeing the pointer after the function call?
- arrays - 如何在 SwiftUI 自定义结构中显示数组中的下一项?
- amazon-web-services - AWS:通过负载均衡器或服务中任务中指定的公共 IP 访问应用程序
- java - 无法在 Android 10 中从意图打开文件
- memory-management - “__GFP_NOFAIL”和“__GFP_REPEAT”有什么区别?
- angular - 我应该如何在 asp .net core API 中返回错误
- java - 找不到符号、JUnit、枚举方法
- reactjs - 按其值着色 office-ui-fabric-react DetailsList Cell
- python - ImportError:无法从“tensorflow.python.framework”导入名称“device_spec”
- python - 查找列(称为文本)中是否包含单词