我有一个执行DNS检查的命令行工具。如果DNS检查成功,命令将继续执行进一步的任务。我正在尝试使用Mockito编写单元测试。下面是我的代码:
public class Command() {
// ....
void runCommand() {
// ..
dnsCheck(hostname, new InetAddressFactory());
// ..
// do other stuff after dnsCheck
}
void dnsCheck(String hostname, InetAddressFactory factory) {
// calls to verify hostname
}
}
字符串
我使用InetAddressFactory模拟InetAddress
类的静态实现。下面是工厂的代码:
public class InetAddressFactory {
public InetAddress getByName(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}
型
下面是我的单元测试用例:
@RunWith(MockitoJUnitRunner.class)
public class CmdTest {
// many functional tests for dnsCheck
// here's the piece of code that is failing
// in this test I want to test the rest of the code (i.e. after dnsCheck)
@Test
void testPostDnsCheck() {
final Cmd cmd = spy(new Cmd());
// this line does not work, and it throws the exception below:
// tried using (InetAddressFactory) anyObject()
doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class));
cmd.runCommand();
}
}
型
运行testPostDnsCheck()
测试时出现异常:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
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"));
型
有什么建议吗?
9条答案
按热度按时间u4vypkhs1#
错误消息概述了解决方案。
字符串
当需要使用所有原始值或所有匹配器时,使用一个原始值和一个匹配器。正确的版本可能是:
型
3pmvbmvn2#
我有同样的问题很长一段时间了,我经常需要混合匹配器和值,我从来没有设法做到这一点与Mockito.直到最近!我把解决方案放在这里,希望它会帮助别人,即使这篇文章是相当旧的。
很明显,在Mockito中不可能同时使用Matchers AND值,但是如果有一个Matcher接受比较一个变量呢?这将解决这个问题.
字符串
在本例中,'metas'是一个现有的值列表
hzbexzde3#
它可能会在未来帮助一些人:Mockito不支持mocking 'final'方法(现在)。
对我来说,解决方案是把方法中不必是“final”的部分放在一个单独的、可访问的和可重写的方法中。
查看Mockito API的用例。
ylamdve64#
可能对某些人有帮助。Mocked方法必须是mocked class,使用
mock(MyService.class)
创建gdx19jrr5#
在我的例子中,这个异常是因为我试图模拟一个
package-access
方法而引发的。当我将方法访问级别从package
更改为protected
时,异常就消失了。例如,在Java类下面,字符串
方法
String getName(String id)
必须是至少protected
级别,这样mocking机制(子类化)才能工作。utugiqy66#
尽管使用了所有的匹配器,我还是遇到了同样的问题:
字符串
我花了一点时间才弄清楚,我试图模仿的方法是一个类的静态方法(比如Xyz.class),它只包含静态方法,我忘记写下面一行:
型
这可能会帮助其他人,因为它也可能是问题的原因。
ykejflvf7#
另一种选择是使用捕获器:https://www.baeldung.com/mockito-argumentcaptor
字符串
如果您想要捕获的对象的一个成员可能是一个随机ID,而另一个成员是您可以验证的对象,则捕获器特别有用。
htrmnn0y8#
正确答案如下:
1.请注意,您没有在RunWith注解下使用SpringRunner运行。而是使用@RunWith(value = MockitoJUnitRunner.class)
1.将所有@MockBean更改为@Mock
1.必须执行测试的类不应该是@Autowiere,而应该是@InjectMocks
1.查看您正在运行方法的类的所有私有成员都使用ReflectionUtil初始化:例如。
ReflectionTestUtils.setField(manualRiskCasePipeline,“salesForceServiceClient”,salesForceServiceClient);
1.另外,不要使用iskey作为when().thenReturn(iskey)的返回,这会导致argumentMismatch,而应该使用:when().thenReturn(null);
rkttyhzu9#
不要使用Mockito. anymore(),直接将值传递给同类型的方法参数。示例:
字符串