以下MyDictionary.get
の方法では、を注入してmap.get
を呼び出します。@InjectMocksでアノテーションされたクラスのメソッドをスタブする方法はありますか?
好奇心のちょうど私はMyDictionary.get
メソッドをスタブしました。私はいつもモックとスパイと同じように、私は注射を上書きします。
しかし、MyDictionary.get
が実際にmap.get
を呼び出した場合にのみ機能します。 map.get
が何らかの文字列(ここでは空の文字列)を返す場合、スタブMockito.when
は機能しません。あたかもそこにいないかのような振る舞いです。アサーション行では、dictionary.get("key")
は空の文字列と等しくなります。これは私が理解していないものです。
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
Map<String, String>map;
@InjectMocks
MyDictionary dictionary;
@Test
public void testMyDictionary(){
Mockito.when(dictionary.get("key")).thenReturn("value");
Assert.assertEquals("value", dictionary.get("key"));
}
private static class MyDictionary{
private Map<String, String> map;
public String get(String key){
return map.get(key);
// or,
return "";
}
}
}
あなたが得るの辞書の方法やモックとしたいです注入されたマップのメソッドを取得し、実際のDictionary.getメソッドを呼び出しますか? –
モックやスパイではないものに 'when'を使うことはできません。' @ InjectMocks'は模擬やスパイではなく、テスト中のあなたの実際のシステムであることを意味します。 'dictionary'をスパイにしても、なぜこの問題が起こるのかについては、[私の他の答え](http://stackoverflow.com/a/38573651/1426891)をご覧ください。 –
@MaciejKowalski私は 'MyDictionary.get'メソッドをスタブしたかったのですが、上記の' when'コールでこれを行うと、これを行うことで 'map.get'メソッドをスタブしています!これは私が理解していないものです。 – ericj