[英]Can't figure out why verification doesn't work properly
我有一個奇怪的測試代碼,總是綠色的。 同時其中一個測試不應該是綠色的。 請參閱下面的代碼。
這是我需要測試的課程
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)
JUnit為每個測試方法創建一個新實例,相反,TestNG為整個套件創建一個測試實例。 這意味着您的實例變量不會在測試方法之間重置。
測試應該更新實例字段,或者為Mockito重置它們( Mockito.reset(...)
)。
請注意,您可以在Mockito項目中找到一些TestNG實用程序類 ,但它們尚未分發,但有助於以與JUnit相同的方式創建模擬。 然而,由於模擬是使用PowerMock創建的,因此它是一個不同的故事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.