mpm*_*pmp 5 java unit-testing mockito
我基本上是在尝试验证是否在方法中调用了正确的参数。
这是我尝试测试的代码片段:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.in("type", Arrays.asList("employee", "supervisor");
Run Code Online (Sandbox Code Playgroud)
使用以下方法验证:
Mockito.verify(mockSession).createCriteria(User.class);
Mockito.verify(mockCriteria).add(Restrictions.in("type", Arrays.asList("employee", "supervisor"));
Run Code Online (Sandbox Code Playgroud)
第一个验证语句有效。第二个不是,因为我相信 JVM 检测到两个不同的List对象进行比较。但是,当我将第二个验证语句更改为:
Mockito.verify(mockCriteria).add(Restrictions.in("type", Mockito.anyList());
Run Code Online (Sandbox Code Playgroud)
它就像一个魅力。但是,我确实想确保员工和主管这两个字符串在内部,List并且使用Mockito.anyList().
我如何让这个工作?
编辑:请注意,我不想只验证列表是否已通过。我想确保在该列表中传递正确的字符串
不幸的是,在这里您无法轻松地使用匹配器检查您想要检查的内容。
\n\nMockito 匹配器通过 side-effects 工作,其中对匹配器的调用告诉 Mockito 使用匹配器而不是测试相等性。这意味着Mockito 匹配器在嵌套在 Criterion 等对象中时根本不起作用。
\n\nverify(mockCriteria).add(\n Restrictions.in("type", Arrays.asList("employee", "supervisor"));\nRun Code Online (Sandbox Code Playgroud)\n\n在上面,您不使用匹配器,您正在验证使用您指定的条件mockCriteria.add调用的对象。equals但是,如果返回的 Criterion 不覆盖equals(and hashCode),那么它只会测试实例是否相同\xe2\x80\x94,这在这里永远不会成立,因为您正在语句中创建一个新实例verify。
verify(mockCriteria).add(Restrictions.in("type", anyList()));\nRun Code Online (Sandbox Code Playgroud)\n\n在这里,看起来您正在验证是否mockCriteria.add使用任何列表调用,但anyList()实际上告诉 Mockito 跳过检查一个参数并返回虚拟值null。然后,您创建一个 Criterion,其中“type” in null,然后 Mockitoany在堆栈上看到一个用于单参数方法调用的匹配器,丢弃新创建的无效 Criterion,并仅检查是否add调用了该 Criterion。看起来一切正常,但您mockCriteria实际上可以收到任何参数,包括null测试仍然会通过。(如果您使用第二个匹配器,或者add采用两个参数,您将得到InvalidUseOfMatchersException而不是误报。)
要使用 Mockito 匹配器进行此操作,您需要编写自己的 Hamcrest 匹配器来匹配整个 Criterion,然后使用argThatMockito 来匹配参数。
正如安迪·特纳提到的,解决这个问题的一种方法是使用ArgumentCaptor:
ArgumentCaptor<Criterion> captor = ArgumentCaptor.forClass(Criterion.class);\nverify(mockCriteria).add(captor.capture());\nCriterion criterion = captor.getValue();\n// assert against criterion\nRun Code Online (Sandbox Code Playgroud)\n\n但是,请注意,这可能用途有限:Criterion没有很多可以检查的属性。您可能需要使用toString(),就像在这个SO问题中一样。
| 归档时间: |
|
| 查看次数: |
8304 次 |
| 最近记录: |