1. powermock是基於mockito或者easymock,TestNG之上的mock;
2. 提供了對於靜態函數,私有函數的mock
4. 通過mock價值是直接使用的類;因為只有mock返回的代理實例才會有“預期”行為。反之,如果一個模擬的類是在測試代碼中間接被使用,則mock失效,如果你無法把mock的實例(對象代理)傳遞給測試場景中需要使用到的內容。比如測試代碼是topTask,Platform,Platform中內部通過調用RuleService來進行獲取規則數據,Platform並沒有提供接口為RuleService賦值,那么你即使模擬了RuleService來獲取某個規則數據,無效,因為Platform中使用的實例和mock實例是兩個實例。
上代碼:
基類
public class ClassA {
public boolean getResult() {
return false;
}
public int caculatePublic(int a, int b) {
return caculate(a, b);
}
private int caculate(int a, int b) {
return a + b;
}
public static int getValue() {
return 1;
}
}
測試類:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.*;
import static org.powermock.api.mockito.PowerMockito.*;
/**
* @author Lorry
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassA.class)
public class TestClassA {
@Test
public void test() {
try {
ClassA ca = mock(ClassA.class);
assertFalse(ca.getResult());
when(ca.getResult()).thenReturn(true);
assertTrue(ca.getResult());
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testStatic() {
assertEquals(1, ClassA.getValue());
mockStatic(ClassA.class);
when(ClassA.getValue()).thenReturn(10);
assertEquals(10, ClassA.getValue());
}
//@Test
public void testPrivate() {
try {
//ClassA ca = spy(new ClassA());
//assertEquals(3, ca.caculatePublic(1, 2));
//when(ca.caculatePublic(Mockito.anyInt(), Mockito.anyInt())).thenCallRealMethod();
//when(ca, "caculate", 1, 2).thenReturn(99);
//assertEquals(99, ca.caculatePublic(1, 2));
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
}
