2017-03-02 4 views
2

以下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 ""; 
     } 
    } 
} 
+0

あなたが得るの辞書の方法やモックとしたいです注入されたマップのメソッドを取得し、実際のDictionary.getメソッドを呼び出しますか? –

+0

モックやスパイではないものに 'when'を使うことはできません。' @ InjectMocks'は模擬やスパイではなく、テスト中のあなたの実際のシステムであることを意味します。 'dictionary'をスパイにしても、なぜこの問題が起こるのかについては、[私の他の答え](http://stackoverflow.com/a/38573651/1426891)をご覧ください。 –

+0

@MaciejKowalski私は 'MyDictionary.get'メソッドをスタブしたかったのですが、上記の' when'コールでこれを行うと、これを行うことで 'map.get'メソッドをスタブしています!これは私が理解していないものです。 – ericj

答えて

1

私はあなたが@Mockや@SpyされていないオブジェクトのメソッドをスタブにしてみたときにスローされるMissingMethodInvocationExceptionを取得しないことに本当に驚いています。

dictionaryインスタンスは、ここではMockitoによってプロキシされていないクラスの通常のインスタンスです(@ InjectMocksアノテーションのみが使用されているためです)。

map.getがトリガーされたときに文字列戻りメソッドのデフォルト戻り値がnullになると、nullが返されないという別の驚きがあります。とにかく

..あなたは `辞書」インスタンスのメソッドをスタブにしたい場合は

あなたは次のようにテストクラスを設定する必要があります。

@InjectMocks 
@Spy 
MyDictionary dictionary; 

@Test 
public void testMyDictionary(){ 
    doReturn("value").when(dictionary).get("key); 
    Assert.assertEquals("value", dictionary.get("key")); 
} 
+0

'MyDictionary.get(key)が" "を返すとき、モックオブジェクトがないので、私は' MissingMethodInvocationException'を見ます。 '' MyDictionary.get(key)がmap.get(key) 'を返すとき、例外は存在しません。結論として、テストでは 'MyDictionary.get'メソッドをスタブしようとしていますが、実際には' Map.get'メソッドがスタブされています( 'map'はモックです)。 – ericj

+0

元のコードですべてのことが起こりますか?それとも私の変更後? –

関連する問題