2012-02-20 10 views
5

は、私は次のコードを持っている:実際に渡されたクラスの型のクラスのみと一致する(MyClass.class)

verify(javaCompiler, times(1)).writeJavaAndCompile(any(ContractCompilationUnit.class), eq(outputDirectory)); 
verify(javaCompiler, times(1)).writeJavaAndCompile(any(ParamCompilationUnit.class), eq(outputDirectory));  

をし、私のコードは次のようである:第一検証がjavaCompiler.writeJavaAndCompile()から2回の呼び出しがあったことを見ているようだとして、

javaCompiler.writeJavaAndCompile(new ContractCompilationUnit(), outputDirectory); 
javaCompiler.writeJavaAndCompile(new ParamCompilationUnit(), outputDirectory); 

コードが失敗しています。タイプContractCompilationUnitタイプのコールが1つしかないことに気づいていません。

この動作を回避するための標準的な手順は何ですか(独自のマッチャーを作成する必要はありません)。

答えて

6

documentationこれは既知の現象であることを示している:

所与のクラスの必要な任意の種類のオブジェクトではありません。 class引数は、キャストを避けるためにのみ提供されています。 は時々ANYOBJECT()よりも良く見える - 明示的なキャストがANYOBJECT()に

エイリアスを必要とする場合は特に

は、任意の型チェックをしないこの方法、それはあなたのコードでキャストを避けるためにだけ存在し。ただし、これは将来のメジャーリリースで変更される可能性があります(型チェックが追加される可能性があります)。

あなたの代わりにisAを使用する必要があるように見えます:

verify(javaCompiler).writeJavaAndCompile(isA(ContractCompilationUnit.class), 
             eq(outputDirectory)); 
+1

をはい、間違いなく 'isA'を。しかし、 'times(1) 'を書いてはいけません。何も追加していないので、私の肌を這うことになります。 –

+0

@DavidWallace:私はOPのオリジナルコードを単にコピーしていました:) Mockitoを使用していないので、おそらくその呼び出しを完全に削除できますか? –

+0

ありがとうございます、@ JonSkeet。あなたはちょうど世界を若干保健所にしました。 –

関連する問題