Mockito匹配器|正确使用

时间:2015-11-02 18:28:28

标签: junit mockito

Mockito提供了许多匹配器,如any(),anyClass()等。

人们可以就他们的用法进行辩论。但是我觉得,当我们并不真正关心输入对象包含的内容时,应该使用匹配器,只要它是预期的类。

我只是想知道这种用法是否正确?如果没有,使用它们的更好方法是什么?

例如:

假设在使用某个请求对象调用方法时,我们有一个期望运行时异常的测试。由于我们在调用mock时显式抛出运行时异常,因此请求对象的内容无关紧要。所以这个测试似乎是合乎逻辑的。

@Test(expected = RunTimeException.class)
public void testExceptionOccurs() {
  when(mock.method(any(RequestObject.class))).thenThrow(new RuntimeException());

  mock.method(new RequestObject());
}

这是正确的方法吗?

1 个答案:

答案 0 :(得分:4)

你是对的,允许给定类型的任何对象对于Matchers来说是一个很好的用途,并且你正确地调用匹配器,但是代码没有按照你所描述的那样做

在Mockito 1.x中,def functy (listx,dictx): for item in listx: if item in dictx: dictx[item]+=1 >>> listy=['dgdg','thth','zuh','zuh','thth','dgdg'] >>> dicty = {'dgdg':1, 'thth':2, 'zuh':5} >>> print dicty {'thth': 2, 'zuh': 5, 'dgdg': 1} >>> functy(listy, dicty) >>> print dicty {'thth': 4, 'zuh': 7, 'dgdg': 3} 实际上不会检查参数的类型。它的行为与any(RequestObject.class)相同,除了Java 8之前,Java编译器无法推断指定为参数的泛型类型。 而是使用anyObject()来检查类型。

Mockito的默认行为是使用isA(RequestObject.class)(或原始类型的equals)来检查参数相等的特定相等性。我发现==(和any等)是最有价值的,因为他们完全为了匹配而忽略了一个参数,但是有很多理由你想要覆盖它Matchers的anyInt行为:

  • 仅使用equals检查参数的类型。
  • 要检查比isA更具体的实例,例如使用equals检查引用相等
  • 检查参数的属性,例如传递的bean对其中一个属性具有特定值。
  • 通过sameintThat等方式重复使用Hamcrest匹配器。

最后注意事项:如果您在参数列表中的任何位置使用匹配器或捕获器,请确保在该调用中为每个参数使用一个匹配器。 Mockito needs that 1:1 mapping.

更新:Mockito提交者Brice已提供some historical background and future direction

  

对于历史参考,argThatany的简写别名,当时API强制一个人施放,贡献者和/或提交者考虑将该类作为参数传递以避免此演员表,不改变此API的语义。然而,这种变化最终改变了人们认为这个API正在做的事情。 这将在mockito 2 +

中修复