我遇到了 Mockito 和 Hamcrest 的泛型问题。
请假设以下界面:
public interface Service {
void perform(Collection<String> elements);
}
以及以下测试片段:
Service service = mock(Service.class);
// ... perform business logic
verify(service).perform(Matchers.argThat(contains("a", "b")));
因此,我想验证我的业务逻辑是否确实使用按顺序包含“a”和“b”的集合调用了该服务。
然而,返回类型contains(...)
is Matcher<Iterable<? extends E>>
, so Matchers.argThat(...)
回报Iterable<String>
就我而言,这自然不适用于所需的Collection<String>
.
我知道我可以使用中提出的参数捕获器Hamcrest hasItem 和 Mockito 验证不一致 https://stackoverflow.com/questions/17174192/hamcrest-hasitem-and-mockito-verify-inconsistency,但我非常不想这样做。
有什么建议么!
谢谢!
你可以只写
verify(service).perform((Collection<String>) Matchers.argThat(contains("a", "b")));
从编译器的角度来看,这是强制转换Iterable<String>
to a Collection<String>
这很好,因为后者是前者的子类型。在运行时,argThat
将返回null
,这样就可以传递给perform
没有ClassCastException
。重要的一点是匹配器进入 Mockito 的内部参数结构进行验证,这就是argThat
does.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)