2017-07-20 10 views
0

私のユニットテストコードは正しいですか?Android Junit test with mockito

LoginFragmentViewModel.java

private final LoginRepository mLoginRepository; 
    MutableLiveData<String> mLoginResponseLiveData;  

    public LoginFragmentViewModel() { 
     mLoginRepository = new LoginRepository(); 
    } 

    public LiveData<String> doLogin(String username, String password) { 
     mLoginResponseLiveData = mLoginRepository.login(username, password); 
     return mLoginResponseLiveData; 
    } 

LoginFragmentViewModelTest.java

@Test 
public void check_do_login(){ 
     LoginRepository loginRepository = mock(LoginRepository.class); 
     MutableLiveData<String> mutableLiveData = mock(MutableLiveData.class); 
     mutableLiveData.setValue("Testing value"); 
     when(loginRepository.login(anyString(), anyString())).thenReturn(mutableLiveData); 

     LiveData<String> stringLiveData = mLoginFragmentViewModel.doLogin("[email protected]", "[email protected]"); 
     assertEquals(stringLiveData.getValue(),"Testing value"); 
} 

答えて

2

あなたは間違っモックなっている:

MutableLiveData<String> mutableLiveData = mock(MutableLiveData.class); 
mutableLiveData.setValue("Testing value"); 

最初の行はモックオブジェクトを作成します。このオブジェクトは何もありません実際の実装と関係があります。したがって、あなたの2番目の呼び出しは無意味なです!

代わりに模擬仕様が必要です。以下のような他のモックのために:

when(mutableLiveData.getValue()).thenReturn("Testing value"); 

しかし質問です:あなたは、あなたがMutableLiveDataの嘲笑インスタンスを作成する必要があることを確認してください?

私が概説した問題を修正しても、テストではプロダクションコードを「再実装」しているだけです。はい、テストではその生産コードがテストされますが、プロダクションコードを変更するとすぐにテストが中断される可能性があります。

かいつまん:

  • はあなたが本当にmutableLiveData
  • を模擬する必要がある場合は、多分テスト対象のクラスは、単に「小さすぎる」であることを検討してください。あなたはテストのための公的な契約に焦点を当てたいと思う。あなたの生産コードの契約はかなり小さいです...小さい。
+0

私の最初の疑問は、ViewModelクラスのdoLoginのような単体テストの簡単なメソッドに必要があります。リポジトリへの転送コードが含まれています.2番目に、同じテストからログインメソッド(同じリポジトリクラス)を嘲笑せずにテストします。リポジトリクラスのメソッドを個別にテストすべきですか? – Ramprasad

関連する問題