Java mockito.veify()给出了错误的调用计数

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{ 私

我正在尝试mockito.verify()特性,方法调用只有一次,但verify显示调用3次。单元测试只有一个测试,以确保没有其他方式影响此测试。 Mockito.verify(utilClass,Mockito.times(1)).hello();///但是调用是3次,是错误吗

我尝试过使用log,它显示调用是一次性的。添加了多次故意调用方法utilClass.hello(),然后显示正确的调用次数。但在调用一次的给定代码中,显示为调用了3次

待测类别:

@组件
公共类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