我正在尝试测试我为客户端开发的应用程序。由于他们在医学领域工作,因此有许多协议。因此,即使存在更好的解决方案,我也可能无法更改测试的开发方式。
我必须编写一个测试,根据我们从Web服务器获取的JSON的内容检查应用程序的不同行为。对于测试,我想模拟此响应。
流程如下:
问题所在在于代码的组织方式,这是演示者必须检查的方法:
public void fetchConfig() {
model.fetchConfig(new Callback<Config>() {
@Override
public void onResponse(@NonNull Call<Config> call, @NonNull Response<Config> response) {
Config config = response.body();
model.saveConfig(config);
handleConfig(config);
}
@Override
public void onFailure(@NonNull Call<Config> call, @NonNull Throwable t) {
Config config = model.getConfig();
handleConfig(config);
}
});
}
我要做的是根据测试的要求发送不同的response.body。
我尝试了许多不同的方法(doAnswer,when()。thenAnswer(),...),但是它们都无法正常工作。
这是我需要根据测试返回不同的Call的接口中的方法:
@GET("config")
Call<Config> getConfig(@Query("serialNumber") String serialNumber);
所有Web调用均使用Retrofit2和OKHttp进行。测试是用Robolectric和Mockito进行的。
这是我在实施过程中走得最远的地方:
Callback<ch.intento.pro.model.Config> mockedCallback = mock(Callback.class);
Call<ch.intento.pro.model.Config> mockedCall = mock(Call.class);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Gson gson = new Gson();
ch.intento.pro.model.Config config =
gson.fromJson(mockServerResponse(
"config_200_ok_response_remote_disabled.json"),
ch.intento.pro.model.Config.class);
System.out.print("Config object: " + config.getLicenceValidUntil() + " " + config.isLicenceValid());
mockedCallback.onResponse(mockedCall, Response.success(config));
model.fetchConfig(mockedCallback);
return null;
}
}).when(presenter).fetchConfig();
presenter.fetchConfig();
verify(view).showInvalidLicence();
在此先感谢您的帮助;我希望我提供了足够的细节。