class LoginPresenter extends BasePresenter<LoginContract.Model, LoginContract.View> {

    public void login() {
        if(mRootView.getMobileStr().length() != 11){
            mRootView.showMessage("手机号码不正确");
            return;
        }
        if(mRootView.getPassWordStr().length() < 1){
            mRootView.showMessage("密码太短");
            return;
        }
        //调用登录接口，正确的密码：abc  手机号只要等于11位判断账号为正确
        mModel.login(mRootView.getMobileStr(),mRootView.getPassWordStr())
                .compose(RxUtils.applySchedulers(mRootView))
                .subscribe(new MyErrorHandleSubscriber<User>(mErrorHandler) {
                    //这个类是我自定义的一个类，统一拦截所有error 并回调给： ResponseErrorListenerImpl
                    @Override
                    public void onNext(User user) {
                            mRootView.loginSuccess();
                    }
                });

    }

}

class LoginPresenterTest {

    @Rule
    public MockitoRule mockitoRule;
    private LoginPresenter mPresenter;
    private LoginModel model;
    private LoginContract.View view;

    @Test
    public  void loginSuccess(){

        //模拟数据
        Mockito.when(view.getMobileStr()).thenReturn("13547250999");
        Mockito.when(view.getPassWordStr()).thenReturn("abc");

        //实现loginModel login 方法
        //由于不知道上哪里去找一个稳定且长期可用的登录接口，
        // 所以用的接口是github 上的查询接口：https://api.github.com/users/drchengit
        // 这里的处理是正确的密码，请求存在的用户名：drchengit  错误的密码请求不存在的用户名： drchengi
        Observable<User> observable = ArmsUtils.obtainAppComponentFromContext(
                RuntimeEnvironment.application).repositoryManager()
                .obtainRetrofitService(CommonService.class)
                .getUser("drchengit");

        //模拟无论怎么调用，login都是返回上面的Observable对象
        Mockito.when(model.login(Mockito.anyString(),Mockito.anyString()))
                .thenReturn(observable);
        //登录
        mPresenter.login();
        Mockito.verify(view).loginSuccess();
    }

}