Junit Mockito matchers |正确使用

Junit Mockito matchers |正确使用,junit,mockito,Junit,Mockito,Mockito提供了许多匹配器,如any()、anyClass()等 人们可以就它们的用法进行辩论。但我觉得,当我们不真正关心输入对象包含的内容时,应该使用匹配器,只要它是预期的类 我只是想知道这个用法是否正确?如果没有,更好的使用方法是什么 例如: 假设我们有一个测试,当使用某个请求对象调用某个方法时,该测试期望出现运行时异常。因为我们在调用mock时在这里显式抛出运行时异常,所以请求对象的内容是什么并不重要。所以这个测试似乎合乎逻辑 @Test(expected = RunTimeExcep

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

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

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

例如:

假设我们有一个测试,当使用某个请求对象调用某个方法时,该测试期望出现运行时异常。因为我们在调用mock时在这里显式抛出运行时异常,所以请求对象的内容是什么并不重要。所以这个测试似乎合乎逻辑

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

  mock.method(new RequestObject());
}

这是正确的方法吗

允许给定类型的任何对象对Matcher都有很大的用处,而且您正确地调用了Matcher,但是代码没有做到您所描述的

在mockito1.x中,
any(RequestObject.class)
实际上不会检查参数的类型。它的行为与
anyObject()
相同,只是在Java 8之前,Java编译器无法推断指定为参数的泛型类型相反,使用
isA(RequestObject.class)
检查类型。


Mockito的默认行为是使用
equals
(或
==
用于基本类型)检查参数相等性,特别是相等性。我发现
any
(和
anyInt
等)是最有价值的,因为它们完全出于匹配的目的而忽略参数,但是有很多原因,您希望用匹配器覆盖
等于
的行为:

  • 要仅检查参数的类型,请使用
    isA
  • 要比定义的
    equals
    更具体地检查实例,就像使用
    same
    检查引用相等性一样
  • 检查参数的属性,例如,传递的bean的某个属性具有特定的值
  • 通过
    intThat
    argThat
    等重复使用Hamcrest匹配器
最后一点注意:如果您在参数列表中的任何位置使用匹配器或捕获器,请确保在该调用中的每个参数都使用一个匹配器或捕获器


更新:Mockito提交人提供:

作为历史参考,
any
anything
的简写别名,当时API强制转换,贡献者和/或提交者考虑将类作为参数传递以避免此转换,而不更改此API的语义。然而,这一变化最终改变了人们对该API的看法这将在mockito 2+中修复。


您是对的,允许给定类型的任何对象对于匹配器来说都是非常有用的,并且您正确地调用了匹配器,但是代码没有执行您所描述的操作

在mockito1.x中,
any(RequestObject.class)
实际上不会检查参数的类型。它的行为与
anyObject()
相同,只是在Java 8之前,Java编译器无法推断指定为参数的泛型类型相反,使用
isA(RequestObject.class)
检查类型。


Mockito的默认行为是使用
equals
(或
==
用于基本类型)检查参数相等性,特别是相等性。我发现
any
(和
anyInt
等)是最有价值的,因为它们完全出于匹配的目的而忽略参数,但是有很多原因,您希望用匹配器覆盖
等于
的行为:

  • 要仅检查参数的类型,请使用
    isA
  • 要比定义的
    equals
    更具体地检查实例,就像使用
    same
    检查引用相等性一样
  • 检查参数的属性,例如,传递的bean的某个属性具有特定的值
  • 通过
    intThat
    argThat
    等重复使用Hamcrest匹配器
最后一点注意:如果您在参数列表中的任何位置使用匹配器或捕获器,请确保在该调用中的每个参数都使用一个匹配器或捕获器


更新:Mockito提交人提供:

作为历史参考,
any
anything
的简写别名,当时API强制转换,贡献者和/或提交者考虑将类作为参数传递以避免此转换,而不更改此API的语义。然而,这一变化最终改变了人们对该API的看法这将在mockito 2+中修复。


总是使用
isA
而不是
any
,不是更好吗?@Templar绝对不是“总是”:
isA
,这可能不是必需的或可取的。更重要的是,Mockito语法在默认情况下支持灵活性,以减少响应重构和其他更改的测试脆性;通常情况下,参数值不太可能具有相关类型但不相关的值(其中,
any
将覆盖一个完全不相关的参数,而其他匹配程序将覆盖一个相关值)。始终使用
isA
而不是
any
?@Templar绝对不是“始终”:
isA
,不是更好吗,这可能是不必要或不可取的。更重要的是,Mockito语法在默认情况下支持灵活性,以减少响应重构和其他更改的测试脆性;通常,参数值不太可能具有相关类型但不相关的值(其中
any
将覆盖完全不相关的参数,而其他匹配器将覆盖相关值)。