gpt4 book ai didi

java - mockito.verify() 给出了错误的调用计数

转载 作者:行者123 更新时间:2023-11-30 05:30:01 25 4
gpt4 key购买 nike

我正在尝试mockito.verify()功能,该方法仅调用一次,但verify显示调用3次。单元测试只有一个测试,以确保该测试不会受到其他影响。Mockito.verify(utilClass, Mockito.times(1)).hello();///但是调用了3次,就是错误

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

要测试的类:

@Component
public class UtilClass {

private static final Logger logger = LoggerFactory.getLogger(UtilClass.class);

public String hello() {
logger.info("hello method invoked");
return "Hello World,"+ hi();
}

private String hi() {
logger.info("hi method invoked");
return "Hi All";
}
}
@Component
public class ClassWithDependency {

@Autowired
private UtilClass utilClass;

public String welcome() {
String msg = utilClass.hello();
return msg;
}

}

测试用例


@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.TooManyActualInvocations: utilClass.hello(); Wanted 1 time: -> at com.sd.demo.powermock.test.injectmock.InjectMockTest.testMock(InjectMockTest.java:54) But was 3 times: -> at com.sd.demo.powermock.injectmock.ClassWithDependency.welcome(ClassWithDependency.java:13) -> at com.sd.demo.powermock.injectmock.ClassWithDependency.welcome(ClassWithDependency.java:13) -> at com.sd.demo.powermock.injectmock.ClassWithDependency.welcome(ClassWithDependency.java:13) at com.sd.demo.powermock.test.injectmock.InjectMockTest.testMock(InjectMockTest.java:54) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) .............

最佳答案

最后让测试工作,解决方案是“SPY”。监视util类,这样就不会告诉真正调用哪个方法。我不知道如何注入(inject) spy ,所以使用了 setter..

@InjectMocks 私有(private) ClassWithDependency classWithDependency;

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));
}

关于java - mockito.verify() 给出了错误的调用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57775074/

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