如何unit testing改造API调用

我正在尝试为每个可能的代码块集成unit testing用例。 但是,我正在面临的问题,同时增加了通过改造的 API调用的testing用例

JUnit编译器从不执行CallBack函数中的代码

还有另一个选项,使所有的API调用同步进行testing目的,但这不可能在我的应用程序的每个案例。

任何人都可以帮我解决这个问题。 我必须以任何方式在api调用中添加testing用例。

任何其他方法的build议也将有所帮助。

提前致谢!

我使用Mockito,Robolectric和Hamcrest库来testing我的Retrofitcallback。

首先,在你的模块的build.gradle中设置lib堆栈:

dependencies { testCompile 'org.robolectric:robolectric:3.0' testCompile "org.mockito:mockito-core:1.10.19" androidTestCompile 'org.hamcrest:hamcrest-library:1.1' } 

在jour项目的全局build.gradle中添加以下行来构build脚本依赖项:

 classpath 'org.robolectric:robolectric-gradle-plugin:1.0.1' 

然后在Android Studio中input“Build Variants”菜单(快速find它,点击Ctrl + Shift + A并search),然后将“Test Artifact”选项切换到“Unit Tests”。 Android工作室将切换您的testing文件夹“com.your.package(testing)”(而不是androidTest)。

好。 设置完成,有时间写一些testing!

比方说,你有一些改进的api调用来检索一个对象的列表,需要被放入一个适配器为一个RecyclerView等。我们想testing适配器是否充满正确的项目成功调用。 为了做到这一点,我们需要切换你的Retrofit接口实现,你用它来模拟调用,并利用Mockito ArgumentCaptor类做一些假的响应。

 @Config(constants = BuildConfig.class, sdk = 21, manifest = "app/src/main/AndroidManifest.xml") @RunWith(RobolectricGradleTestRunner.class) public class RetrofitCallTest { private MainActivity mainActivity; @Mock private RetrofitApi mockRetrofitApiImpl; @Captor private ArgumentCaptor<Callback<List<YourObject>>> callbackArgumentCaptor; @Before public void setUp() { MockitoAnnotations.initMocks(this); ActivityController<MainActivity> controller = Robolectric.buildActivity(MainActivity.class); mainActivity = controller.get(); // Then we need to swap the retrofit api impl. with a mock one // I usually store my Retrofit api impl as a static singleton in class RestClient, hence: RestClient.setApi(mockRetrofitApiImpl); controller.create(); } @Test public void shouldFillAdapter() throws Exception { Mockito.verify(mockRetrofitApiImpl) .getYourObject(callbackAgrumentCaptor.capture()); int objectsQuantity = 10; List<YourObject> list = new ArrayList<YourObject>(); for(int i = 0; i < objectsQuantity; ++i) { list.add(new YourObject()); } callbackArgumentCaptor.getValue().success(list, null); YourAdapter yourAdapter = mainActivity.getAdapter(); // Obtain adapter // Simple test check if adapter has as many items as put into response assertThat(yourAdapter.getItemCount(), equalTo(objectsQuantity)); } } 

通过右键单击testing课程并点击运行来继续testing。

就是这样。 我强烈build议使用Robolectric(带robolectric gradle插件)和Mockito,这些库使testingandroid应用程序的整个lotta更容易。 我从以下博客文章中学到了这个方法。 另外,请参考这个答案 。

更新 :如果您正在使用RxJava进行Retrofit,请查看我的其他答案 。

如果使用.execute()而不是.enqueue(),它会使执行同步,因此testing可以正常运行,无需导入3个不同的库并添加任何代码或修改构build变体。

喜欢:

 public class LoginAPITest { @Test public void login_Success() { APIEndpoints apiEndpoints = RetrofitHelper.getTesterInstance().create(APIEndpoints.class); Call<AuthResponse> call = apiEndpoints.postLogin(); try { //Magic is here at .execute() instead of .enqueue() Response<AuthResponse> response = call.execute(); AuthResponse authResponse = response.body(); assertTrue(response.isSuccessful() && authResponse.getBearer().startsWith("TestBearer")); } catch (IOException e) { e.printStackTrace(); } } }