我已经看到人们对改装2进行单元测试的许多不同方式,我觉得这是我最近的一次。我可以模拟我的api接口,但是当涉及模拟调用时,该调用总是返回null
。有什么我想念的或做错的吗?
这是我的测试方法:
@Test
public void testApiSuccess() {
TestRequestBody testRequestBody = Util.getTestBody();
ApiService mockedApiService = Mockito.mock(ApiService.class);
Call<Void> mockedCall = Mockito.any(Call.class);
when(mRestClient.apiService()).thenReturn(mockedApiService);
Mockito.when(mockedApiService.executeApi(testRequest)).thenReturn(mockedCall);
Mockito.doAnswer(invocation -> {
Callback<Void> callback = invocation.getArgumentAt(0, Callback.class);
callback.onResponse(mockedCall, Response.success(null));
return null;
}).when(mockedCall).enqueue(any(Callback.class));
presenter.executeApi();
verify(view).showSuccess();
}
我正在测试的代码块如下:
@Override
public void executeApi() {
RequestBody requestBody = getRequestbody();
Call<Void> call = mRestClient.apiService().executeApi(requestBody);
call.enqueue(new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
if (response != null && response.code() == 200) {
view.showSuccess();
} else {
view.showError();
}
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
view.showError();
}
});
}
我的测试一直进行到
call.enqueue
为止,并在这里失败,因为call
为null。当我尝试模拟call
时出了点问题。现在被困在这里半天了。任何线索都可以帮上忙。 最佳答案
我怀疑这是因为您希望在模拟中传递给executeApi()
的请求正文与传递给代码块中的executeApi()
的正文不同,就像在getRequestBody();
!= Util.getTestBody();
中一样,因此您的模拟调用永远不会返回。
解决方案是在演示者级别上也使请求主体成为参数。从测试中以这种方式,您可以调用presenter.executeApi(testRequestBody);
,它将使用期望的参数调用executeApi并返回模拟的Call
。
关于java - mock Call <Void>时,单元测试retrofit2调用使我为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60824911/