がAndroidAnnotationsのSharedPreferencesに呼び出すモックチェーン方法は、私は<a href="https://github.com/androidannotations/androidannotations/wiki/SharedPreferencesHelpers" rel="nofollow noreferrer">SharedPreferences</a>を生成する<a href="http://androidannotations.org/" rel="nofollow noreferrer">AndroidAnnotations</a>を使用していたプロジェクトで
preferences.enabled().get();
preferences.enabled().put(true);
私が記述しようとしていますいくつかの論理をチェックする単体テスト。そこ私は好みをモックとしたい:
は@Mock MyPreferences_ prefs;
MyLogic logic;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
logic = new Logic();
}
@Test
public void testEnabled() throws Exception {
when(prefs.enabled().get()).thenReturn(false);
assertThat(logic.isEnabled()).isEqualTo(false);
}
しかし、アクセスprefs.enabled()
スローNullPointerException
:
java.lang.NullPointerException at com.example.MyLogicTest.isValuesStoredProperly(MyLogicTest.java) ...
それはMockitoと(nullのオブジェクトを含む)の連鎖メソッド呼び出しを模擬することは可能ですか?
更新
helpful suggestions by alayorに基づいて更新として、次のように私は私の実装を変更:
public class MyLogicTest {
@Mock SharedPreferences prefs;
@Mock CustomSharedPreferences_ prefs_;
MyLogic logic;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
logic = new MyLogic();
}
@Test
public void testEnabled() throws Exception {
MockPrefs mockPrefs = new MockPrefs(prefs);
when(prefs_.enabled()).thenReturn(mockPrefs.getEnabledPrefField());
doNothing().when(prefs_.enabled()).put(anyBoolean()); // <-- fails
when(prefs_.enabled().get()).thenReturn(false);
assertThat(logic.isEnabled()).isEqualTo(false);
}
private class MockPrefs extends SharedPreferencesHelper {
public MockPrefs(SharedPreferences sharedPreferences) {
super(sharedPreferences);
}
public BooleanPrefField getEnabledPrefField() {
return super.booleanField("enabled", enabledOld);
}
}
}
これはまだはここを失敗:
doNothing().when(prefs_.enabled()).put(anyBoolean());
prefs_.enabled()
からBooleanPrefField
オブジェクトがありますfinal
と嘲笑することはできません。
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at MyLogicTest.testEnabled
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, which is not supported
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
サンプルプロジェクト
ソリューション
- 上記のサンプルプロジェクトで作業を見つけてください。
'prefs.enabled()'は何を返しますか? – alayor