久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

使用 Mockito 進行 Retrofit 2 api 調用的單元測試

Unit Test of Retrofit 2 api call with Mockito(使用 Mockito 進行 Retrofit 2 api 調用的單元測試)
本文介紹了使用 Mockito 進行 Retrofit 2 api 調用的單元測試的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我需要一些關于如何模擬 rest api 的建議.我的應用程序采用 MVP 架構.

I need some advices on how to mock a rest api. My application is in MVP architecture.

我的 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);
    }

還有另一種方法可以通過編寫模擬服務來測試我的演示者.但我不太喜歡這樣,我認為 Mockito 可以提供幫助.

There is another way to test my presenter by writing a Mock service. But I don't like that so much and I think Mockito could help.

這是我的測試類:

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("user@email.com","password");
        verify(view).loginSuccess();
    }

}

我想做的是在響應正確時模擬響應數(shù)據調用 loginSuccess().

What I want to do is I mock the response data call loginSuccess() when the response is correct.

當然,我目前的測試不會奏效.我需要一些關于如何模擬這個的建議?任何的想法?謝謝.

Of course my current test will not work. I need some advices on how to mock this? Any idea? Thanks.

推薦答案

你可以用下一個方法:

@Test
public void testLoginWithCorrectUserNameAndPassword() throws Exception {
    // create or mock response object
    when(service.login(anyString(), anyString(), anyString).thenReturn(Observable.just(response));
    mLoginPresenter.login("user@email.com","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("user@email.com","password");
    verify(view).showError(anyString);
}

這篇關于使用 Mockito 進行 Retrofit 2 api 調用的單元測試的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯(lián)網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯(lián)系我們刪除處理,感謝您的支持!

相關文檔推薦

EditText: Disable Paste/Replace menu pop-up on Text Selection Handler click event(EditText:禁用文本選擇處理程序單擊事件上的粘貼/替換菜單彈出)
Multiline EditText with Done SoftInput Action Label on 2.3(2.3 上帶有完成 SoftInput 操作標簽的多行 EditText)
How to detect the swipe left or Right in Android?(如何在 Android 中檢測向左或向右滑動?)
Prevent dialog dismissal on screen rotation in Android(防止在Android中的屏幕旋轉對話框解除)
How do I handle ImeOptions#39; done button click?(如何處理 ImeOptions 的完成按鈕點擊?)
How do you set EditText to only accept numeric values in Android?(您如何將 EditText 設置為僅接受 Android 中的數(shù)值?)
主站蜘蛛池模板: 男人av网 | 久久国产一区二区 | 日韩av一区在线观看 | 免费看的黄网站 | 毛片免费视频 | 91天堂网| 久久一区二区精品 | 国产精品免费小视频 | 欧美综合一区二区 | 国产激情自拍视频 | 日韩欧美国产精品 | 黄免费观看视频 | 久久久久久久久淑女av国产精品 | 一级做a| 九九久久久 | av天天爽| 天天插天天射天天干 | 欧美一区二区三区 | 伊人春色在线 | 国产美女精品视频 | 4hu最新网址| 久久久资源| 国产精品大全 | 九九热精品视频 | 成年男女免费视频网站 | 国产乱码精品1区2区3区 | 欧美日韩视频在线播放 | 美女在线视频一区二区三区 | 中文字幕加勒比 | 亚洲国产精品va在线看黑人 | 爱草在线 | 国产成人精品一区二区三区在线 | 久久婷婷国产香蕉 | 亚洲精品9999久久久久 | 中文字幕av网 | 国产伦精品一区二区三区照片91 | 美国av毛片| 久久久久久久久久性 | 精品成人一区二区 | 成人三级在线观看 | 亚洲成人一区二区三区 |