我试图为每一段可能的代码集成单元测试用例。
但是,我在为通过改造而进行的api调用添加测试用例时遇到了问题。
JUnit编译器从不执行回调函数中的代码
还有另一种方法可以使所有api调用同步,以进行测试,但这不可能适用于我的应用程序中的所有情况
我怎样才能解决这个问题?我必须以任何方式在api调用中添加测试用例
我使用Mockito、Robolectric和Hamcrest库测试我的改装回调
首先,在模块的build.gradle中设置lib堆栈:
依赖项{
testCompile’org.roblectric:roblectric:3.0′
testCompile“org.mockito:mockito核心:1.10.19”
androidTestCompile’org.hamcrest:hamcrest库:1.1′
}
在jour项目的global build.gradle中,将以下行添加到buildscript依赖项:
classpath'org.roblectric:roblectric gradle插件:1.0.1'
然后在androidstudio中进入“buildvariants”菜单(要快速找到它,点击Ctrl+Shift+A并搜索),然后将“testartifact”选项切换到“unittests”。Android studio将把您的测试文件夹切换到“com.your.package(test)”(而不是androidTest)
嗯。设置完成了,是时候写一些测试了
假设您有一些改装api调用来检索需要放入某个适配器中的对象列表,以用于RecyclerView等。我们想测试适配器在成功调用时是否填充了适当的项。
要做到这一点,我们需要切换您的改型接口实现,您使用它来使用模拟进行调用,并利用Mockito ArgumentCaptor类进行一些虚假响应
@Config(常数=BuildConfig.class,sdk=21,
manifest=“app/src/main/AndroidManifest.xml”)
@RunWith(RobolectricGradleTestRunner.class)
公开课考试{
私人活动;
@嘲弄
私人改装空气污染指数改装空气污染指数;
@俘虏
private ArgumentCaptor<;Callback<;List<;YourObject>;>;>;callbackArgumentCaptor;
@以前
public void setUp(){
initMocks(this);
ActivityController<;MainActivity>;controller=Robolectric.buildActivity(MainActivity.class);
mainActivity=controller.get();
//然后,我们需要用一个模拟的api impl.来替换改型api impl
//我通常将改装api impl作为静态单例存储在RestClient类中,因此:
setApi(mockapimpl);
controller.create();
}
@试验
public void shouldFillAdapter()引发异常{
Mockito.verify(mockapimpl)
.getYourObject(callbackArgumentCaptor.capture());
int objectsQuantity=10;
List<;YourObject>;List=newarraylist<;YourObject>;();
对于(int i=0;i<;objectsQuantity;++i){
添加(新的YourObject());
}
callbackArgumentCaptor.getValue().success(列表,空);
YourAdapter YourAdapter=mainActivity.getAdapter();//获取适配器
//简单的测试检查适配器是否有和放入响应中一样多的项
断言(yourAdapter.getItemCount(),equalTo(objectsQuantity));
}
}
通过右键单击测试类并点击run继续测试
就这样。我强烈建议使用Robolectric(带有Robolectric gradle插件)和Mockito,这些LIB使测试android应用程序变得更加容易。
我从下面的博文中学到了这个方法。另外,请参考此答案
更新:如果您正在使用RxJava进行改装,请查看我关于这方面的其他回答