2017-11-07 2 views
1

2つのマップにスプリングを注入するクラスをテストする必要があります。 私は両方のマップを模擬したいと思います。次のように 私はモックの表記を使用します。クラス内の2つのマップをモックする

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

を私は次のエラーを取得する:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.Date 

唯一の最初の嘲笑マップは両方のマップに使用されているようです。

私は間違っていますか?あなたが同じインターフェイスを持つ2つのモックを注入しようとするため

+0

作品私のために。 Mockito ver 1.10.19。あなたが私たちに見せない何かがありますか? – Michael

答えて

0

は、おそらくあなたは問題がある

は、参考のために、このtopicから第2のポストを見てみてください(変数名は、例えばプロパティに一致していません)。

プロパティセッター注入;モックはまず型によって解決され、 の場合、同じタイプのいくつかのプロパティがある場合は、 プロパティ名と模擬名の一致によって解決されます。

+0

2番目のポストでrecommandedのように "InjectMocks"表記を使う代わりに、コンストラクタでマップを挿入していました。 InjectMocksが私の場合にはうまくいかない理由は分かりません。 –

1

mockitoは、2つのフィールドのタイプが同じであれば、タイプによってモックを挿入する方法を知らない場合があります。だからそれは名前で注入しようとします。この場合、テスト対象のクラスのフィールドの名前が、作成したモックオブジェクトと一致しないように見えます。

フィールド注入;ここ はdoc@InjectMocksするためのものですモックは最初にタイプ別に解決されます( )。 には、同じタイプのいくつかのプロパティがあり、フィールド の名前とモック名が一致すると、タイプ一致のインジェクションが実行されます。

あなたの提出の名前を変更するか、明示的なモックの名前を使用することができ、次のいずれか

@Mock(name="foo") 
private Map<String, Integer> map1; 

@Mock(name="bar") 
private Map<String, Date> map2; 

しかし、私はこれが最善の解決策であるとは思いません。ファイル名が変更された場合、偽陰性のテスト結果が得られます。機能は正しく動作しますが、テストは失敗します。

私にとっては、テストするクラスがコンストラクタ内の依存関係を受け取るように、コードをリファクタリングすることをお勧めします。その後、あなたはこのようにそれを模擬することができますでも

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

private ClassUnderTets cut; 

@Before 
public void setUp() throws Exception { 
    cut = new ClassUnderTets(map1, map2); 
} 

または:

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

@InjectMocks 
private ClassUnderTets cut; 

をドキュメントで述べたように:

コンストラクタ・インジェクション。最大のコンストラクタは引数がのみ

+0

助けてくれてありがとう、私はすでにInjectMocks表記を使っていましたが、うまくいきませんでした。私はそれをコンストラクタの依存関係に置き換えたとき、それは働いた –

0

は次に、あなただけのような挙動を模擬する必要があります

@Mock 
private Map map1; 

@Mock 
private Map map2; 

代わり

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

を試すテストで宣言さ モックで解決され、その後、選択されています:

when(map1).get("hello").thenReturn(25); 
when(map2).get("birthday").thenReturn(new Date(2000, 07, 24)); 
関連する問題