1

メソッドの1つで、状態を共有設定に保存していることを確認するインストゥルメントテストに問題があります。テストされたコードは次のようになります。MockitoとDaggerを使用したSharedPreferences

initialPresenter.getLocalData().edit() 
        .putString("SessionDetails", new Gson().toJson(sessionData)) 
        .putBoolean("relog", false) 
        .apply(); 

LocalDataは、dagger2によってプレゼンターに注入されます。私はそれのためのモックを作成し、私はそこにすべてがうまく動作するように、それらをrepleatingです。例えば。

when(localData.getBoolean("signed_using_email", false)).thenReturn(true); 

データを無効にしたり編集したりするときに問題が発生します。私は別のモックを作りました。エディタの今回は、SharedPrefが編集を呼び出すときに明示的な模擬を取得します。

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences$Editor.putBoolean(java.lang.String, boolean)' on a null object reference 

ところで:

@Mock SharedPreferences.Editor mEditor; 
. 
. 
. 
when(localData.edit()).thenReturn(mEditor); 

だが、私はエラーを取得します。なぜ変わっていないのですか?最初のモックはうまく動作するようですが、入れ子になり(?)、エラーがスローされます。

私はdoNothingを使用したスタブ/置換の代わりに別の方法を試しました。

doNothing().when(localData).edit(); 

しかし、それはまた、エラーを投げて、同様の問題原因:それを修正する方法を

org.mockito.exceptions.base.MockitoException: 
Only void methods can doNothing()! 
Example of correct use of doNothing(): 
doNothing(). 
doThrow(new RuntimeException()) 
.when(mock).someVoidMethod(); 
Above means: 
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called 

任意のアイデア?私は状態を保存する必要はありません、私はそれを後で嘲笑することができます。以前は、sharedPreferencesを使用するメソッド全体を抑制するためにPowerMockitoを使用していましたが、このソリューションはうまくいかないようです。

+1

あなたの問題:

@Mock(answer = RETURNS_SELF) SharedPreferences.Editor mEditor; 

また、あなただけのRETURNS_DEEP_STUBSを使用する場合があります基本的に 'SharedPreferences.Editor'の 'builder'構文を模擬する方法です。 Mockitoでこれを行う方法については、[Jeff Bowmanの答え](https://stackoverflow.com/questions/8501920/how-to-mock-a-builder-with-mockito)を参照してください。つまり、 '@Mock(answer = RETURNS_SELF)SharedPreferences.Editor mEditor;' –

+0

@DavidRawsonに感謝してください! mockを に変更しました。mEditor = mock(SharedPreferences.Editor.class、RETURNS_DEEP_STUBS); と動作するようです。私はそれを受け入れることができるように答えとしてあなたのコメントを投稿できますか? :) – Kamajabu

答えて

2

ここでの問題は、SharedPreferences.Editorにはそれぞれ、putString()putBoolean()などの呼び出しがEditorを返す「ビルダー」構文を持つことです。

このオブジェクトをモックすると、これらのメソッドの1つが呼び出されるたびにモックが戻ります。

Jeff Bowman's answerを1としてMockitoとビルダー構文をからかっに、あなたのコードを次のように変更してこれを行うことができます。

mEditor = mock(SharedPreferences.Editor.class, RETURNS_DEEP_STUBS); 
関連する問題