【问题标题】:How can I do unit testing for retrofit callbacks?如何对改造回调进行单元测试?
【发布时间】:2016-09-10 19:01:53
【问题描述】:

我正在尝试为 android 中的改造 2 回调创建统一案例。我用于测试 mockito、MockWebServer 和 MockResponse。

public class LoginFragment extends Fragment {
/**
     * Actualiza el numero telefonico para el usuario
     *
     * @param phoneNumber
     */
    public  void phoneNumber(String phoneNumber) {
        HttpService service = Service.createService(HttpService.class, TOKEN);
        Call<Void> call = service.phonumber(phoneNumber, new User("", ""));
        call.enqueue(callback());
    }

    /**
     * @return Callback<Void>
     */
    public Callback<Void> callback() {
        return new Callback<Void>() {
            @Override
            public void onResponse(Call<Void> call, Response<Void> response) {
                if (response.isSuccessful()) {
                    dummy();
                } else {
                    Log.e(TAG, "problema");
                }
            }

            @Override
            public void onFailure(Call<Void> call, Throwable t) {
                Log.e(TAG, " " + t);
            }
        };
    }

    public void dummy(){
        System.out.println(" called");
    }
}

我最团结的班级:

@RunWith(MockitoJUnitRunner.class)
public class TestLoginFragment {
   MockWebServer mockWebServer;

    @Before
    public void setup() throws Exception {
        spyLoginFragment = mock(LoginFragment.class);
        mockWebServer = new MockWebServer();
    }


    @Test
    public void testDummyIsCalled() {
        spyLoginFragment.phoneNumber("3333335");
        mockWebServer.enqueue(new MockResponse().setResponseCode(201));
        verify(spyLoginFragment, times(1)).dummy();
    }
}

但是当你运行测试时,我得到:

TestLoginFragment > testDummyIsCalled FAILED
    Wanted but not invoked:
    loginFragment.dummy();

我是新人做回调测试,如何验证dummy()被调用了?

【问题讨论】:

  • 如果只调用execute()会简单很多,它会同步执行请求。你打算做什么测试?其余客户端是否正常工作,或者您的应用对其成功/失败的响应?
  • 嗨@fractalwrench,我正在尝试测试响应(成功/失败),检查是否调用了functon dummy()。如何调用 execute() ?
  • 只需调用.execute(),如果您不确定execute() 和enqueue() 之间的区别,则值得查看改造文档
  • 我是片段上的 execute() 和 enqueue() 之间的区别,需要异步调用,但是如何在片段登录中对改造回调进行单元测试?例如检查 onResponse 和 onFailure

标签: android unit-testing retrofit retrofit2 okhttp3


【解决方案1】:

根据定义,单元测试只测试单元本身的功能。因此,它可能无法捕获集成错误。

您不应该测试改造框架或其回调,您必须假定改造总是有效的。仅测试您的代码,因此为 phoneNumber(String phoneNumber) 创建一个测试以检查服务是否配置正确(无需启动改造服务),并创建其他测试以检查在 OnSuccess 或 OnFailure 情况下来自服务器的可能响应。

PD:如果你想测试 Retrofit 调用和回调方法之间的耦合,那么你说的是“集成测试”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2017-12-22
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2021-09-20
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多