我已经看到人们对改装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/

10-12 01:20
查看更多