Leader要求在做Junit測試的時候,Mock掉各個方法之間的依賴。這兩天學習了下PowerMock的使用。
PowerMock是EasyMock的一個擴展,加入了static,final,private,以及constructor的Mock功能。但是PowerMock並沒有繼承EasyMock的一些測試功能,所以不能取代EasyMock,而單獨使用。在很多時候必須要PowerMock和EasyMock相互結合,以及加上WhiteBox,才能更好實現測試。
1. 必不可少的一步:添加測試運行器@RunWith(PowerMockRunner.class),如果沒有添加這個運行器,則使用的是默認的JUnit4.class。在PrepareForTest中加入測試class。@PrepareForTest(測試.class)
2. Construtor
public class A{
public void doA(){
B.doB();
}
}
public class B{
public B(){
System.out.println("can't be here!");
}
}
測試classA中的doA方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest({A.class})
public class ATest {
@Test
public void testdoA() throws Exception {
B mockB = PowerMock.createMock( B.class );
PowerMock.expectNew( B.class ).andReturn(mockB);
A testA = new A();
PowerMock.replayAll();
testA.doA();
PowerMock.verifyAll();
}
}
3.static
測試static方法的時候必須要加上@PrepareForTest(靜態方法.class),否則就會拋出java.lang.IllegalStateException: no last call on a mock available異常。如果有多個class,用{},例如@PrepareForTest({A.class,B.class})
public class A{
public void doA(){
B.doB();
}
}
public class B{
public static String doB() {
return ("can't be here !");
}
}
測試classA中的doA方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest({A.class, B.class})
public class ATest {
@Test
public void testdoA() throws Exception {
PowerMock.mockStatic( B.class );
EasyMock.expect(B.doB()).andReturn("Mocked !");
A testA = new A();
PowerMock.replayAll();
assertEquals("Mock not complete !", testA.doA(), "Mocked !");
PowerMock.verifyAll();
}
}
4.mock類中的Field
一個好的Field應該有getter和setter,但是代碼中沒有,我們也可以用WhiteBox來Mock掉Field。
public class A{
private String C;
public A(){
C = "Can't be here !";
}
public String doA(){
return C;
}
}
測試A中的doA方法
@RunWith(PowerMockRunner.class)
@PrepareForTest({A.class, B.class})
public class ATest {
@Test
public void testdoA(){
A testA = new A();
String mockC = "Mocked !";
Whitebox.setInternalState( testA, "C", mockC );
assertEquals("Mock not complete !", testA.doA(), "Mocked !");
}
}