Junit Mockito matchers |正确使用
Mockito提供了许多匹配器,如any()、anyClass()等 人们可以就它们的用法进行辩论。但我觉得,当我们不真正关心输入对象包含的内容时,应该使用匹配器,只要它是预期的类 我只是想知道这个用法是否正确?如果没有,更好的使用方法是什么 例如: 假设我们有一个测试,当使用某个请求对象调用某个方法时,该测试期望出现运行时异常。因为我们在调用mock时在这里显式抛出运行时异常,所以请求对象的内容是什么并不重要。所以这个测试似乎合乎逻辑Junit Mockito matchers |正确使用,junit,mockito,Junit,Mockito,Mockito提供了许多匹配器,如any()、anyClass()等 人们可以就它们的用法进行辩论。但我觉得,当我们不真正关心输入对象包含的内容时,应该使用匹配器,只要它是预期的类 我只是想知道这个用法是否正确?如果没有,更好的使用方法是什么 例如: 假设我们有一个测试,当使用某个请求对象调用某个方法时,该测试期望出现运行时异常。因为我们在调用mock时在这里显式抛出运行时异常,所以请求对象的内容是什么并不重要。所以这个测试似乎合乎逻辑 @Test(expected = RunTimeExcep
@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
等重复使用Hamcrest匹配器argThat
更新: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
等重复使用Hamcrest匹配器argThat
更新:Mockito提交人提供: 作为历史参考,
any
是anything
的简写别名,当时API强制转换,贡献者和/或提交者考虑将类作为参数传递以避免此转换,而不更改此API的语义。然而,这一变化最终改变了人们对该API的看法这将在mockito 2+中修复。
总是使用
isA
而不是any
,不是更好吗?@Templar绝对不是“总是”:isA
,这可能不是必需的或可取的。更重要的是,Mockito语法在默认情况下支持灵活性,以减少响应重构和其他更改的测试脆性;通常情况下,参数值不太可能具有相关类型但不相关的值(其中,any
将覆盖一个完全不相关的参数,而其他匹配程序将覆盖一个相关值)。始终使用isA
而不是any
?@Templar绝对不是“始终”:isA
,不是更好吗,这可能是不必要或不可取的。更重要的是,Mockito语法在默认情况下支持灵活性,以减少响应重构和其他更改的测试脆性;通常,参数值不太可能具有相关类型但不相关的值(其中any
将覆盖完全不相关的参数,而其他匹配器将覆盖相关值)。