使用Mockito进行Retrofit 2 api调用的单元测试

Bagusflyer

我需要一些关于如何模拟Rest API的建议。我的应用程序是在MVP架构中。

我的API接口:

public interface MyAPI {

    @GET("{cmd}/{userName}/{password}")
    Observable<Response> login(
        @Path("cmd") String cmd,
        @Path("userName") String userName,
        @Path("password") String password
    );

我的服务:

public class MyService implements IService {

    private static MyService mInstance = new MyService();
    private MyAPI mApi;

    public static MyService getInstance() {
        return mInstance;
    }

    private MyService() {

        OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
        httpClientBuilder.connectTimeout(Config.DEFAULT_TIMEOUT, TimeUnit.SECONDS);

        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Config.kBaseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(httpClientBuilder.build())
            .build();

        this.mApi = retrofit.create(MyAPI.class);
    }

    public void login(
        Subscriber<Response> subscriber,
        String userName,
        String password) {
        mApi.login(Config.kLoginCmd,userName,password)
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);
    }

我的主持人班:

public class LoginPresenter implements LoginContract.Presenter {

    LoginContract.View mView;
    IService mService;
    ISession mSession;

    public LoginPresenter(LoginContract.View loginView, IService service, ISession session) {
        mView = loginView;
        mService = service;
        mSession = session;
    }

    @Override
    public void login(String email, String password) {

        Subscriber<Response> subscriber = new Subscriber<Response>() {
            @Override
            public void onCompleted() {
                mView.showLoading(false);
            }

            @Override
            public void onError(Throwable e) {
                mView.showError(e.getLocalizedMessage());
            }

            @Override
            public void onNext(Response response) {
                if (response.getResults().getStatus().equalsIgnoreCase(Config.kResultCodeOK)) {
                    mView.loginSuccess();
                } else {
                    mView.showError(response.getResults().getStatus().getErrmsg());
                }
            }
        };

        mView.showLoading(true);
        mService.login(
            subscriber,
            email,
            password);
    }

通过编写Mock服务,还有另一种测试我的演示者的方法。但是我不太喜欢,我认为Mockito可以提供帮助。

这是我的测试课:

public class LoginPresenterMockTest {

    private LoginPresenter mLoginPresenter;

    @Mock
    LoginContract.View view;
    @Mock
    IService service;
    @Mock
    ISession session;

    @Before
    public void setup() throws Exception {
        MockitoAnnotations.initMocks(this);
        mLoginPresenter = new LoginPresenter(view, service, session);
    }

    @Test
    public void testLoginWithCorrectUserNameAndPassword() throws Exception {
        mLoginPresenter.login("[email protected]","password");
        verify(view).loginSuccess();
    }

}

我想做的是,当响应正确时,我模拟响应数据调用loginSuccess()。

当然,我当前的测试将无法正常工作。我需要一些关于如何模拟这一点的建议?任何的想法?谢谢。

伊利亚·特列季亚科夫(Ilya Tretyakov)

您可以通过以下方式进行操作:

@Test
public void testLoginWithCorrectUserNameAndPassword() throws Exception {
    // create or mock response object
    when(service.login(anyString(), anyString(), anyString).thenReturn(Observable.just(response));
    mLoginPresenter.login("[email protected]","password");
    verify(view).loginSuccess();
}

@Test
public void testLoginWithIncorrectUserNameAndPassword() throws Exception {
    // create or mock response object
    when(service.login(anyString(), anyString(), anyString).thenReturn(Observable.<Response>error(new IOException()));
    mLoginPresenter.login("[email protected]","password");
    verify(view).showError(anyString);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 DarkSkyApi 调用进行 Angular 2 服务单元测试

来自分类Dev

使用jUnit和Mockito进行外部REST API调用的单元测试

来自分类Dev

使用SPA中的模拟API进行单元测试与E2E测试

来自分类Dev

使用Robolectric和Mockito对Realm + Dagger 2进行单元测试

来自分类Dev

使用Mockito进行单元测试LazyLogging

来自分类Dev

使用Mockito对POJO进行单元测试

来自分类Dev

使用 jasmine 运行 angular2 单元测试时调用服务时出错

来自分类Dev

具有Retrofit2和Mockito或Robolectric的Android单元测试

来自分类常见问题

使用@Input()进行Angular2单元测试

来自分类Dev

Symfony2:使用sqlite进行单元测试

来自分类Dev

使用MEF2 ExportFactories进行单元测试

来自分类Dev

使用React Router 2进行单元测试路由匹配

来自分类Dev

使用Factory对Zend Framework 2模块进行单元测试

来自分类Dev

使用Dagger 2进行Android单元测试

来自分类Dev

如何对Ajax调用进行单元测试

来自分类Dev

如何在与Jest的react-native中使用模拟的fetch()对API调用进行单元测试

来自分类Dev

使用Karma和Jasmine / Angular 8并行测试多个API调用的服务的单元测试

来自分类Dev

使用 Mockito 进行 Java 单元测试。函数内的函数调用

来自分类Dev

使用 Mockito|Android 对调用私有回调的方法进行单元测试

来自分类Dev

如何在控制器单元测试中进行REST API调用?

来自分类Dev

如何对带有令牌的帖子(web-api)调用进行单元测试?

来自分类Dev

如何对 api 调用进行单元测试并断言反应和酶的状态变化?

来自分类Dev

在Angular 2中对可观察对象进行单元测试

来自分类Dev

如何在Angular 2中对指令进行单元测试?

来自分类Dev

对需要Electron的Angular2服务进行单元测试

来自分类Dev

如何使用Mockito对图节点进行单元测试?

来自分类Dev

使用Mockito库进行Scala单元测试

来自分类Dev

使用 Mockito 对基于 Guice 的类进行单元测试

来自分类Dev

使用 Mockito 对 Realm 包装的 LiveData 进行单元测试

Related 相关文章

  1. 1

    使用 DarkSkyApi 调用进行 Angular 2 服务单元测试

  2. 2

    使用jUnit和Mockito进行外部REST API调用的单元测试

  3. 3

    使用SPA中的模拟API进行单元测试与E2E测试

  4. 4

    使用Robolectric和Mockito对Realm + Dagger 2进行单元测试

  5. 5

    使用Mockito进行单元测试LazyLogging

  6. 6

    使用Mockito对POJO进行单元测试

  7. 7

    使用 jasmine 运行 angular2 单元测试时调用服务时出错

  8. 8

    具有Retrofit2和Mockito或Robolectric的Android单元测试

  9. 9

    使用@Input()进行Angular2单元测试

  10. 10

    Symfony2:使用sqlite进行单元测试

  11. 11

    使用MEF2 ExportFactories进行单元测试

  12. 12

    使用React Router 2进行单元测试路由匹配

  13. 13

    使用Factory对Zend Framework 2模块进行单元测试

  14. 14

    使用Dagger 2进行Android单元测试

  15. 15

    如何对Ajax调用进行单元测试

  16. 16

    如何在与Jest的react-native中使用模拟的fetch()对API调用进行单元测试

  17. 17

    使用Karma和Jasmine / Angular 8并行测试多个API调用的服务的单元测试

  18. 18

    使用 Mockito 进行 Java 单元测试。函数内的函数调用

  19. 19

    使用 Mockito|Android 对调用私有回调的方法进行单元测试

  20. 20

    如何在控制器单元测试中进行REST API调用?

  21. 21

    如何对带有令牌的帖子(web-api)调用进行单元测试?

  22. 22

    如何对 api 调用进行单元测试并断言反应和酶的状态变化?

  23. 23

    在Angular 2中对可观察对象进行单元测试

  24. 24

    如何在Angular 2中对指令进行单元测试?

  25. 25

    对需要Electron的Angular2服务进行单元测试

  26. 26

    如何使用Mockito对图节点进行单元测试?

  27. 27

    使用Mockito库进行Scala单元测试

  28. 28

    使用 Mockito 对基于 Guice 的类进行单元测试

  29. 29

    使用 Mockito 对 Realm 包装的 LiveData 进行单元测试

热门标签

归档