2017-06-10 8 views
0

私は微妙な状況があります。私はアンドロイドのMVPアーキテクチャを使用していますが、それは重要ではありません。 DoStandardLoginUsecaseというクラスがあり、基本的にはログイン情報を持つサーバーに接続し、アクセストークンを取得します。私はそれをテストしようとしています。しかし、問題は私がそれを渡す文脈であるので、私は短剣を初期化することができます。junit - 実際のクラスでフィールドをモックする方法は?

public class DoStandardLoginUsecase extends BaseUseCase { 

    @Inject 
    UserDataRepository mUserDataRepo; 

    private StandardLoginInfo loginInfo; 


    public DoStandardLoginUsecase(Context context) { 
/* SEE HERE I AM USING A APPLICATION CONTEXT THAT I PASS TO DAGGER 
*/ 
     ((MyApplication)context).getPresenterComponent().inject(this); 
    } 

    @Override 
    public Observable<Login> buildUseCaseObservable() { 
     return mUserDataRepo.doStandardLogin(loginInfo); 
    } 

    public void setLoginInfo(StandardLoginInfo loginInfo) { 
     this.loginInfo = loginInfo; 
    } 
} 

、ここで、これまで私が持っているテストです:

public class DoStandardLoginUsecaseTest { 

    DoStandardLoginUsecase standardLoginUsecase; 
     StandardLoginInfo fakeLoginInfo; 
    TestObserver<Login> subscriber; 

MockContext context; 
     @Before 
     public void setUp() throws Exception { 
//now when i create the object since its a mock context it will fail when it tries to call real things as these are stubs. So how do i test this object. how do i create an instance of this object ? I am willing to use [daggerMock][1] if that helps also. 
standardLoginUsecase = New DoStandardLoginUsecase(context); 
      fakeLoginInfo = new StandardLoginInfo("[email protected]","Asdfgh4534"); 
      subscriber = TestObserver.create(); 
     } 


     @Test 
     public void buildUseCaseObservable(){ 

standardLoginUsecase.seLoginInfo(fakeLoginInfo); 
    standardLoginUsecase.buildUseCaseObservable().subscribe(subscriber); 

      subscriber.assertNoErrors(); 
      subscriber.assertSubscribed(); 
      subscriber.assertComplete(); 
     } 
    } 
+0

あなたは 'Mockito.mock' – danielspaniol

+0

缶を使用してモックを作成することができます見せて。私は@mock Context cを試したので、既に。しかし、ダガーコールは本当のコンテキストを必要とします。 – j2emanue

+0

正しく覚えていれば、 '@ Mock'を動作させるためには' @ Rule'が必要です。しかし、単に 'Mockito.mock'関数を使ってモックを作ることもできます。私は私の答えでこのアプローチを行った – danielspaniol

答えて

1

私はこのようなテストを行うだろう:

public class DoStandardLoginUsecaseTest { 

     private DoStandardLoginUsecase target; 
     private MyApplication contextMock; 

     @Before 
     public void beforeEach() { 
      contextMock = Mockito.mock(MyApplication.class); 
      // Note that you need to mock the getPresenterComponent 
      // but I don't know what it returns. 
      target = new DoStandardLoginUsecase(contextMock); 
     } 

     @Test 
     public void buildUseCaseObservable() { 
      UserDataRepository userDataMock = Mockito.mock(UserDataRepository.class); 
      StandardLoginInfo loginInfoMock = Mockito.mock(StandardLoginInfo.class); 
      target.mUserDataRepo = userDataMock; 
      target.setLoginInfo(loginInfoMock); 

      Observable<Login> expected = // create your expected test data however you like... 
      Mockito.when(userDataMock.doStandardLogin(loginInfoMock)).thenReturn(expected); 
      Observable<Login> actual = target.buildUseCaseObservable(); 

      Assert.areSame(actual, expected); 
     } 

} 
+0

ちょっと返事のおかげで。 userDataMockが呼び出されたときには "expcted"が返ってくると言っています。あなたは実際に呼び出された本物のものを呼びます。 target.buildUseCaseObservable()は、「期待値」の値を返すだけです。それは本当のテストではないようです。実際のものはいつも期待通りです。どう思いますか ? – j2emanue

+0

実装を変更し、期待値がまだ返されているかどうかを確認します。 – danielspaniol

関連する問題