自定义匹配器的用途是什么,我们如何与
Object.equal().
我有一个问题,在when()
传递参数时Object.equal()
轻松解决,但有时我需要使用 Matchers。我需要知道行为是什么以及如何执行。
我当前的代码是:
@Test
public void myTest() {
when(service.foo(xyzService, new ARequest(1, "A"))).thenReturn(new AResponse(1, "passed"));
when(service.foo(xyzService, new ARequest(2, "2A"))).thenReturn(new AResponse(2, "passed"));
when(service.foo(xyzService, new BRequest(1, "B"))).thenReturn(new BResponse(112, "passed"));
c.execute();
}
目前它工作正常,但在我的实际业务案例中,我无法模拟它xyzService
方法级变量。我想使用 any()
而不是xyzService
.但在这种情况下,一切都是经纪人。
使用 when
,您可以在固定参数或匹配器上训练模拟方法。我们不能混合。如果要对一个参数使用 any()
匹配器,还必须将另一个参数转换为匹配器:
when(service.foo(any(), eq(new ARequest(1, "A")))).thenReturn(new AResponse(1, "passed"));
如果这对您的测试用例不起作用,则ARequest
中的equals
实现被破坏,或者测试或测试对象(即:对任何服务的预期方法调用,并且此请求永远不会在测试的代码中发生)
通常不需要匹配器,除非在复杂的对象结构中,或者如果您想将相等性基于不同的条件,那么对象相等方法定义了什么。
相等示例
例如,以这个简化的示例(伪代码)为例:
class test {
int x,y,z;
bool equals() {
return x == y && x == z && y == z
}
// should override hashCode as well
}
但是在你的测试中,你只关心x和z匹配,你可以写一个匹配器来执行这个验证。对于给定的示例,显然没有意义,因为比较是如此基本。
复杂对象
我过去曾创建过通用匹配器,可以抓取整个对象图,逐个字段比较执行字段比较。它们还可用于根据上下文执行不同的"匹配"标准。我说可以,因为这通常违反了单一责任原则。