Matcher vs Object.equal?

时间:2017-01-21 06:33:11

标签: java unit-testing junit mockito

Custom Matcher的目的是什么以及我们如何与

进行比较
Object.equal().

我遇到Object.equal()when()中传递参数时很容易解决的问题,但有时我需要使用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。但在这种情况下,一切都是经纪人。

2 个答案:

答案 0 :(得分:2)

使用git fetch origin # update origin/master git checkout new_branch git merge origin/master git push origin new_branch ,您可以在固定参数或匹配器上训练模拟方法。我们不能混。如果要将when匹配器用于一个参数,则必须将另一个参数转换为匹配器:

any()

如果这对您的测试用例不起作用,则when(service.foo(any(), eq(new ARequest(1, "A")))).thenReturn(new AResponse(1, "passed")); 中的equals实现被破坏或者测试或测试对象(即:使用任何服务的预期方法调用请求永远不会发生在经过测试的代码中)

答案 1 :(得分:1)

通常不需要匹配器,除非在复杂的对象结构中,或者如果您希望在不同的条件上建立相等性,那么等于方法的对象定义了什么。

平等示例

例如,采用这个简化的例子(伪代码):

class test {
   int x,y,z;

   bool equals() {
     return x == y && x == z && y == z
   }
 // should override hashCode as well

}

但是在你的测试中你只关心x和z的匹配,你可以写一个匹配器来执行这个验证。对于给定的例子,显然它没有意义,因为比较是如此基本。

复杂对象

我在过去创建了通用匹配器,可以抓取整个对象图执行字段比较。他们也可以用于根据上下文执行不同的“匹配”标准。我说可以,因为这通常会破坏Single Responsibility Principle