请参见以下示例:
class Foo { }
class Bar {
void takeIt(int i, String arg) { System.out.println(arg + i); }
}
public class Mcve {
@Test
public void passes() {
Foo foo = Mockito.mock(Foo.class);
Bar bar = Mockito.mock(Bar.class);
bar.takeIt(42, "surprise: " + foo);
String substring = "surprise: " + foo;
Mockito.verify(bar).takeIt(ArgumentMatchers.eq(42),
ArgumentMatchers.contains(substring));
}
@Test
public void fails() {
Foo foo = Mockito.mock(Foo.class);
Bar bar = Mockito.mock(Bar.class);
bar.takeIt(42, "surprise: " + foo);
Mockito.verify(bar).takeIt(ArgumentMatchers.eq(42),
ArgumentMatchers.contains("surprise: " + foo));
}
}
这两个测试几乎相同,唯一的区别是:用于
contains()
passes()
,但内联
fails()
失败()
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at com.ibm.hwmca.z.svm.zhyp.managed.Mcve.fails(Mcve.java:43)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at Mcve.fails(Mcve.java:43)
...
更有趣的是:只有一个以上的参数匹配时才会失败(如果一个参数删除了
int
参数来自
gimme()
有人能解释一下这里到底发生了什么吗?有没有办法做这样的匹配
contains("surprise: " + foo)
foo
被莫基托嘲笑?
当然,这真的是MCVE的意思。我花了3个小时从我们环境中失败的单元测试到这里的示例。
Foo对象表示一些由假持久层创建的“数据实体”。我必须验证产品代码是否记录特定的信息,其中一些信息是从伪造的数据对象中派生出来的。