gpt4 book ai didi

mocking - 如何在 Mockito 中否定 ArgumentMatcher?

转载 作者:行者123 更新时间:2023-12-02 22:02:51 25 4
gpt4 key购买 nike

我创建了一个ArgumentMatcher

private class IsListOf2Elements implements ArgumentMatcher<List<String>>{
@Override
public boolean matches(List<String> argument) {
return ((List<String>)argument).size()==2;
}
}

我想否定这个匹配,所以当size不为2时匹配,

Mockito.doReturn(false).when(mock).addAll(Mockito.argThat(AdditionalMatchers.not(new IsListOf2Elements())));

但这并不正确。我明白了,

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
No matchers found for additional matcher Not(?)
-> at my.test.own.Mockito_aTest.test4e(Mockito_aTest.java:136)

最佳答案

作为引用,请注意 Hamcrest matchers and Mockito matchers behave very differently 。 Hamcrest 的无状态 Matcher 对象将匹配函数表示为实例,并且可以包装以反转其结果; Mockito 的“注册匹配器”仅通过副作用起作用。

argThat将 Hamcrest 匹配器改编为 Mockito 匹配器,Hamcrest 的 CoreMatchers.not反转 Hamcrest 匹配器,以及 Mockito 的 AdditionalMatchers.not反转 Mockito 匹配器(通过副作用)。这是 CoreMatchers.not 的部分原因总是返回 Matcher<T> ,而AddionalMatchers.not返回任意 T ;它在你看不到的 Mockito 状态下运行。

这会给您带来以下行为:

// BAD: Don't use AdditionalMatchers to invert a Hamcrest matcher.
doReturn(false).when(mock).addAll(
Mockito.argThat(AdditionalMatchers.not(new IsListOf2Elements())));

// GOOD: Use AdditionalMatchers to invert a Mockito matcher. (See ericj's answer.)
doReturn(false).when(mock).addAll(
AdditionalMatchers​.not(Mockito.argThat‌​(new IsListOf2Elements())));

// ALSO GOOD: Use CoreMatchers to invert a Hamcrest matcher. (See troig's answer.)
doReturn(false).when(mock).addAll(
Mockito.argThat‌​(CoreMatchers.not(new IsListOf2Elements())));

如果您所做的异常(exception)是关于 stub 行为,您还可以使用 more-specific override除了特定的异常之外,还可以对一般行为进行 stub 。

关于mocking - 如何在 Mockito 中否定 ArgumentMatcher?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com