test_class.declarator: mockitoRule = MockitoJUnit.rule()
test_class.modifier: @Rule
      public
test_class.original_string: @Rule
      public  MockitoRule mockitoRule = MockitoJUnit.rule();
test_class.type: MockitoRule
test_class.var_name: mockitoRule
test_class.declarator: mPresenter
test_class.modifier: private
test_class.original_string: private LoginPresenter mPresenter;
test_class.type: LoginPresenter
test_class.var_name: mPresenter
test_class.declarator: model
test_class.modifier: private
test_class.original_string: private LoginModel model;
test_class.type: LoginModel
test_class.var_name: model
test_class.declarator: view
test_class.modifier: private
test_class.original_string: private LoginContract.View view;
test_class.type: LoginContract.View
test_class.var_name: view
test_class.file: demo/src/test/java/me/jessyan/mvparms/demo/mvp/presenter/login/LoginPresenterTest.java
test_class.identifier: LoginPresenterTest
test_case.body: @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();
      }
test_case.class_method_signature: LoginPresenterTest.loginSuccess()
test_case.full_signature: @Test public void loginSuccess()
test_case.identifier: loginSuccess
test_case.invocations: thenReturn when getMobileStr thenReturn when getPassWordStr getUser obtainRetrofitService repositoryManager obtainAppComponentFromContext thenReturn when login anyString anyString login loginSuccess verify
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void loginSuccess()
focal_class.declarator: mErrorHandler
focal_class.modifier: @Inject
focal_class.original_string: @Inject
      RxErrorHandler mErrorHandler;
focal_class.type: RxErrorHandler
focal_class.var_name: mErrorHandler
focal_class.declarator: mApplication
focal_class.modifier: @Inject
focal_class.original_string: @Inject
      Application mApplication;
focal_class.type: Application
focal_class.var_name: mApplication
focal_class.declarator: mImageLoader
focal_class.modifier: @Inject
focal_class.original_string: @Inject
      ImageLoader mImageLoader;
focal_class.type: ImageLoader
focal_class.var_name: mImageLoader
focal_class.declarator: mAppManager
focal_class.modifier: @Inject
focal_class.original_string: @Inject
      AppManager mAppManager;
focal_class.type: AppManager
focal_class.var_name: mAppManager
focal_class.file: demo/src/main/java/me/jessyan/mvparms/demo/mvp/presenter/login/LoginPresenter.java
focal_class.identifier: LoginPresenter
focal_class.class_method_signature: LoginPresenter.login()
focal_class.full_signature: public void login()
focal_class.identifier: login
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void login()
focal_class.class_method_signature: LoginPresenter.LoginPresenter(LoginContract.Model model, LoginContract.View rootView)
focal_class.full_signature: @Inject public  LoginPresenter(LoginContract.Model model, LoginContract.View rootView)
focal_class.identifier: LoginPresenter
focal_class.modifiers: @Inject public
focal_class.parameters: (LoginContract.Model model, LoginContract.View rootView)
focal_class.signature:  LoginPresenter(LoginContract.Model model, LoginContract.View rootView)
focal_class.class_method_signature: LoginPresenter.onDestroy()
focal_class.full_signature: @Override public void onDestroy()
focal_class.identifier: onDestroy
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void onDestroy()
focal_class.superclass: extends BasePresenter<LoginContract.Model, LoginContract.View>
focal_method.body: 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();
                      }
                  });
  
      }
focal_method.class_method_signature: LoginPresenter.login()
focal_method.full_signature: public void login()
focal_method.identifier: login
focal_method.invocations: length getMobileStr showMessage length getPassWordStr showMessage subscribe compose login getMobileStr getPassWordStr applySchedulers loginSuccess
focal_method.modifiers: public
focal_method.parameters: ()
focal_method.return: void
focal_method.signature: void login()