Mockito提供了许多匹配器,如any(),anyClass()等。
人们可以就他们的用法进行辩论。但是我觉得,当我们并不真正关心输入对象包含的内容时,应该使用匹配器,只要它是预期的类。
我只是想知道这种用法是否正确?如果没有,使用它们的更好方法是什么?
例如:
假设在使用某个请求对象调用方法时,我们有一个期望运行时异常的测试。由于我们在调用mock时显式抛出运行时异常,因此请求对象的内容无关紧要。所以这个测试似乎是合乎逻辑的。
@Test(expected = RunTimeException.class)
public void testExceptionOccurs() {
when(mock.method(any(RequestObject.class))).thenThrow(new RuntimeException());
mock.method(new RequestObject());
}
这是正确的方法吗?
答案 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
检查引用相等。same
,intThat
等方式重复使用Hamcrest匹配器。最后注意事项:如果您在参数列表中的任何位置使用匹配器或捕获器,请确保在该调用中为每个参数使用一个匹配器。 Mockito needs that 1:1 mapping.
更新:Mockito提交者Brice已提供some historical background and future direction:
对于历史参考,
中修复argThat
是any
的简写别名,当时API强制一个人施放,贡献者和/或提交者考虑将该类作为参数传递以避免此演员表,不改变此API的语义。然而,这种变化最终改变了人们认为这个API正在做的事情。 这将在mockito 2 +