我有以下代码:

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);

代码失败,因为似乎第一个验证发现对javaCompiler.writeJavaAndCompile()进行了两次调用。未能意识到只有一个ContractCompilationUnit类型的调用。

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

最佳答案

documentation显示这是已知的行为:

任何种类的对象,不是给定类的必需对象。提供类参数仅是为了避免强制转换。
有时看起来比anyObject()更好-特别是在需要显式强制转换时
别名anyObject()
此方法不执行任何类型检查,仅在此处进行以避免类型转换。但是,在将来的主要版本中,可能会更改(可以添加类型检查)。

看来您应该改用isA:

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

07-26 07:23