4

のサブクラスであるクラスがありContextます。このクラスに依存する別のクラスを単体テストしているため、モックしました。ただし、元の動作として機能するメソッドがいくつか必要なので、それらを「モック解除」します。

それらの1つはgetAssets()、私がこれを書いたので、正しく動作します:

Mockito.doReturn(this.getContext().getAssets()).when(keyboard).getAssets();

keyboard言及されたクラスの模擬インスタンスです。

このメソッドはパラメーターをとらないため、オーバーライドは非常に簡単でした。

私もオーバーライドする必要がありますContext.getString(int)。パラメータは物事を難しくし、プリミティブであるため、さらに困難になります。

このアドバイスと別のアドバイスを受けて、次のコードを書いてみました。

Mockito.when(keyboard.getString(Mockito.anyInt())).thenAnswer(new Answer<String>(){
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable
         Integer arg = (Integer)invocation.getArguments()[0];
         return OuterClass.this.getContext().getString(arg.intValue());
    }
});

これはコンパイルおよび実行されましたが、次の例外が発生しました。

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at [...] <The code above>

This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.

at android.content.Context.getString(Context.java:282)
at [...]
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)

したがって、主な質問は、プリミティブパラメーターを持つMockitoのメソッドをオーバーライドする方法ですか?

前もって感謝します

4

3 に答える 3

3

getStringこれは最終的なものであるため、スタブすることはできません。Mockito は final メソッドをスタブできません。スタブを付けずにそのままにしておくと、元の実装が得られます。とにかくそれが欲しいですよね?

于 2013-09-22T09:52:09.317 に答える
1

それはすべきではありませんAnswer<String>か?

Mockito.when(keyboard.getString(Mockito.anyInt())).thenAnswer(new Answer<String>(){
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
         return "foo";
    }
});

そして、キーボードの名前を変更できます->mockContext、それはより明確になりますか?

于 2013-09-22T08:47:37.247 に答える