我有一个奇怪的测试代码,它始终是绿色的。同时其中一个测试不应该是绿色的。请参阅下面的代码。
这是我需要测试的课程
public class A {
private String param;
public void print(){
System.out.println(this.param);
}
public static void printHello(){
System.out.println("Hello!");
}
}
自己测试
import org.mockito.Spy;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import static org.powermock.reflect.Whitebox.invokeMethod;
public class ATest {
@Spy
private A a = new A();
@BeforeMethod
public void setUp() {
initMocks(this);
}
@Test
public void test() {
// When
a.print();
// Than
verify(a, times(1)).print();
}
@Test
@PrepareForTest(A.class)
public void testStatic() throws Exception {
mockStatic(A.class);
replay();
invokeMethod(A.class, "printHello");
verifyStatic(times(10)); // must be fail
}
}
显然,方法testStatic()应该失败,因为它不会调用10次。
UPD
这是我的新版测试
@PrepareForTest(A.class)
public class ATest extends PowerMockTestCase {
@Spy
private A a = new A();
@BeforeMethod
public void setUp() {
initMocks(this);
}
@Test
public void test() {
// When
a.print();
// Than
verify(a, times(1)).print();
}
@Test
@PrepareForTest(A.class)
public void testStatic() throws Exception {
mockStatic(A.class);
replay();
invokeMethod(A.class, "printHello");
verifyStatic(times(10)); // must be fail
}
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new org.powermock.modules.testng.PowerMockObjectFactory();
}
}
错误堆栈跟踪
org.mockito.exceptions.verification.TooManyActualInvocations:
a.print();
Wanted 1 time:
-> at com.aaron.simple.ATest.test(ATest.java:37)
But was 2 times. Undesired invocation:
-> at com.aaron.simple.ATest.test(ATest.java:34)
答案 0 :(得分:2)
我认为测试类应该使用@RunWith(PowerMockRunner.class)
如果没有这个Powermock基本上什么都不做。
好的,你使用TestNG。它仍然需要相同的信息。部分中的setup is described here"配置TestNG以使用PowerMock对象工厂"。
答案 1 :(得分:0)
JUnit为每个测试方法创建一个新实例,相反,TestNG为整个套件创建一个单独的测试实例。这意味着您的实例变量不会在测试方法之间重置。
测试应该更新实例字段,或者Mockito重置它们(Mockito.reset(...)
)。
请注意,您可以在Mockito项目中找到一些TestNG utility classes,但它们尚未分发,但有助于以与JUnit相同的方式创建模拟。然而,由于模拟是使用PowerMock创建的,所以它是一个不同的故事。