Java 任何(MyClass.class)实际上只匹配所传递类类型的类?

Java 任何(MyClass.class)实际上只匹配所传递类类型的类?,java,unit-testing,testing,mocking,mockito,Java,Unit Testing,Testing,Mocking,Mockito,我有以下代码: verify(javaCompiler, times(1)).writeJavaAndCompile(any(ContractCompilationUnit.class), eq(outputDirectory)); verify(javaCompiler, times(1)).writeJavaAndCompile(any(ParamCompilationUnit.class), eq(outputDirectory)); 我的代码如下: javaCompile

我有以下代码:

verify(javaCompiler, times(1)).writeJavaAndCompile(any(ContractCompilationUnit.class), eq(outputDirectory));
verify(javaCompiler, times(1)).writeJavaAndCompile(any(ParamCompilationUnit.class), eq(outputDirectory));       
我的代码如下:

javaCompiler.writeJavaAndCompile(new ContractCompilationUnit(), outputDirectory);
javaCompiler.writeJavaAndCompile(new ParamCompilationUnit(), outputDirectory);
代码失败,因为第1次验证似乎看到有2次调用
javaCompiler.writeJavaAndCompile()
。它没有意识到只有一个类型为
ContractCompilationUnit
type的调用

避免这种行为的标准程序是什么(除了必须编写自己的匹配程序)?

表明这是已知的行为:

任何类型的对象,不是给定类所必需的。提供类参数只是为了避免强制转换。 有时看起来比anyObject()更好-尤其是在需要显式强制转换时

anyObject()的别名

此方法不进行任何类型检查,只是为了避免在代码中强制转换。但是,在未来的主要版本中,这可能会发生变化(可以添加类型检查)

看起来您应该使用
isA

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

是的,绝对是
isA
。但是请不要写
次(1)
-它不会添加任何内容,而且会让我的皮肤蠕动。@DavidWallace:我只是复制OP的原始代码:)没有使用Mockito,我大概可以完全删除该调用?谢谢你这么做,@JonSkeet。你让世界变得更理智了。