gpt4 book ai didi

java - Mockito异常: org.mockito.exceptions.misusing.InvalidUseOfMatchersException

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

我有这个代码:

import static org.mockito.Mockito.*;

final Combobox combobox = mock(Combobox.class);

//.... some business logic which calls method 'appendChild' on 'combobox'

verify(combobox, times(3)).appendChild((Component) anyObject()); // <<== exception here

它总是这样写:

Invalid use of argument matchers!
2 matchers expected, 1 recorded.
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.

appendChild 方法如下所示:

public final boolean appendChild(Component child)
{
return insertBfr(null, child);
}

最佳答案

appendChild 是一个 final方法,这意味着 you can't mock or verify it 。 Java 编译器将“final”理解为它可以确定它正在调用哪个实际方法实现,这意味着它可以采用捷径直接调用该代码,而不是允许 Mockito 潜入并替换实现。总的来说,这是人们推荐的好理由之一not to mock types you don't own or control .

重构您的测试,或使用 PowerMockito执行深度字节码魔法来模拟这些 final方法。

(为什么会出现这个异常?匹配器 actually affect static state in Mockito 。因为您在该行上调用 anyObject ,Mockito 仍然 registers a Matcher 。该匹配器与您的下一个匹配器匹配不存在的参数调用 whenverify,或者如果使用 the Mockito usage validator 则被 MockitoJUnitRunner 捕获。无论哪种方式,这都是一个很好的捕获,因为代码不执行以下操作你认为是这样。)

关于java - Mockito异常: org.mockito.exceptions.misusing.InvalidUseOfMatchersException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18226130/

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