匹配者与对象相等



自定义匹配器的用途是什么,我们如何与

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匹配,你可以写一个匹配器来执行这个验证。对于给定的示例,显然没有意义,因为比较是如此基本。

复杂对象

我过去曾创建过通用匹配器,可以抓取整个对象图,逐个字段比较执行字段比较。它们还可用于根据上下文执行不同的"匹配"标准。我说可以,因为这通常违反了单一责任原则。

相关内容

  • 没有找到相关文章