Java mockito.veify()给出了错误的调用计数
我正在尝试mockito.verify()特性,方法调用只有一次,但verify显示调用3次。单元测试只有一个测试,以确保没有其他方式影响此测试。 Mockito.verify(utilClass,Mockito.times(1)).hello();///但是调用是3次,是错误吗 我尝试过使用log,它显示调用是一次性的。添加了多次故意调用方法utilClass.hello(),然后显示正确的调用次数。但在调用一次的给定代码中,显示为调用了3次 待测类别:Java mockito.veify()给出了错误的调用计数,java,junit,mockito,powermockito,Java,Junit,Mockito,Powermockito,我正在尝试mockito.verify()特性,方法调用只有一次,但verify显示调用3次。单元测试只有一个测试,以确保没有其他方式影响此测试。 Mockito.verify(utilClass,Mockito.times(1)).hello();///但是调用是3次,是错误吗 我尝试过使用log,它显示调用是一次性的。添加了多次故意调用方法utilClass.hello(),然后显示正确的调用次数。但在调用一次的给定代码中,显示为调用了3次 待测类别: @组件 公共类UtilClass{ 私
@组件
公共类UtilClass{
私有静态最终记录器Logger=LoggerFactory.getLogger(UtilClass.class);
公共字符串hello(){
info(“调用了hello方法”);
返回“Hello World,+hi()”;
}
私有字符串hi(){
logger.info(“调用的hi方法”);
返回“Hi All”;
}
}
@组成部分
具有依赖关系的公共类{
@自动连线
专用UtilClass UtilClass;
公共字符串欢迎(){
字符串msg=utilClass.hello();
返回味精;
}
}
测试用例
@InjectMocks
private ClassWithDependency classWithDependency;
@Mock
private UtilClass utilClass;
@Before
public void init() throws Exception {
PowerMockito.when(utilClass,"hi").thenReturn("Hi Java");
PowerMockito.when(utilClass.hello()).thenCallRealMethod();
}
@Test
public void testMock() throws Exception {
final String msg = classWithDependency.welcome();
final String msgExpected = "Hello World,Hi Java";
logger.info("welcome method called:{}",msg);
PowerMockito.verifyPrivate(utilClass, Mockito.times(1)).invoke("hi");
Mockito.verify(utilClass, Mockito.times(1)).hello();
Assert.assertTrue(msg.equals(msgExpected));
}
我希望mockito.verify会成功,但会出现错误
org.mockito.exceptions.verification.Toomanyactualin职业:
utilClass.hello();
通缉1次:
->位于com.sd.demo.powermock.test.injectmock.InjectMockTest.testMock(InjectMockTest.java:54)
但有3次:
->位于com.sd.demo.powermock.injectmock.ClassWithDependency.welcome(ClassWithDependency.java:13)
->位于com.sd.demo.powermock.injectmock.ClassWithDependency.welcome(ClassWithDependency.java:13)
->位于com.sd.demo.powermock.injectmock.ClassWithDependency.welcome(ClassWithDependency.java:13)
位于com.sd.demo.powermock.test.injectmock.InjectMockTest.testMock(InjectMockTest.java:54)
位于org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
位于org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
最终使测试工作,解决方案是“间谍”。。监视util类,以便不告诉要进行实际调用的方法。我不知道如何注入间谍,所以使用了一个setter @注射模拟 私有类与依赖类与依赖类
private UtilClass mockUtil;
@Before
public void init() throws Exception {
UtilClass utilClass = new UtilClass();
mockUtil = PowerMockito.spy(utilClass);
classWithDependency.setUtilClass(mockUtil);
}
@Test
public void testMock() throws Exception {
PowerMockito.when(mockUtil,"hi").thenReturn("Hi Java");
final String msg = classWithDependency.welcome();
final String msgExpected = "Hello World,Hi Java";
logger.info("welcome method called:{}",msg);
PowerMockito.verifyPrivate(mockUtil, Mockito.times(1)).invoke("hi");
Mockito.verify(mockUtil, Mockito.times(1)).hello();
Assert.assertTrue(msg.equals(msgExpected));
}
可能与PowerMock的使用有关。就我个人而言,我发现有必要使用PowerMock来消除代码的味道。验证公共接口,而不是私有实现。@AndrewS尝试过调试,看起来hello()方法被调用了3次,但它是由mock完成的,不确定原因。。此调试中的util类有三个值。。com.sd.demo.powermock.injectmock.UtilClass$MockitoMock$1924029473$auxiliary$SaGoJRDf@74ecacc3,UtilClass的模拟,哈希代码:950729555