根据来自翻新的JSON测试应用程序行为,覆盖回调响应

时间:2019-01-28 15:52:20

标签: android unit-testing mockito retrofit

我正在尝试测试我为客户端开发的应用程序。由于他们在医学领域工作,因此有许多协议。因此,即使存在更好的解决方案,我也可能无法更改测试的开发方式。

我必须编写一个测试,根据我们从Web服务器获取的JSON的内容检查应用程序的不同行为。对于测试,我想模拟此响应。

流程如下:

  1. 我们在演示者中调用一个方法(fetchConfig)
  2. 此方法调用模型中的另一个方法(也是fetchConfig),该方法在参数中传递回调并处理改型API的响应(onResponse)。

问题所在在于代码的组织方式,这是演示者必须检查的方法:

    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();

在此先感谢您的帮助;我希望我提供了足够的细节。

0 个答案:

没有答案