在實際的工做中,常常碰到只須要mock一個類的一部分方法,這時候能夠用spy來實現。測試
被測類:spa
public class EmployeeService { public boolean exist(String userName) { checkPrivateExist(userName); checkPublicExist(userName); return true; } private void checkPrivateExist(String userName) { throw new UnsupportedOperationException(); } public void checkPublicExist(String userName){ throw new UnsupportedOperationException(); } }
若是要測試exist方法,須要mock checkPublicExist和checkPrivateExist方法,而不但願mock exist方法code
測試類:blog
@PrepareForTest(EmployeeService.class) public class EmployeeServiceTestWithPrivateTest extends PowerMockTestCase{ @ObjectFactory public ITestObjectFactory getObjectFactory() { return new PowerMockObjectFactory(); } @Test public void testExist() { try { EmployeeService service = PowerMockito.spy(new EmployeeService()); PowerMockito.doNothing().when(service,"checkPrivateExist","powermock"); PowerMockito.doNothing().when(service).checkPublicExist("powermock");; boolean result = service.exist("powermock"); Assert.assertTrue(result); Mockito.verify(service).checkPublicExist("powermock"); PowerMockito.verifyPrivate(service).invoke("checkPrivateExist","powermock"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
在測試類中,真實的調用了exist方法。get
須要注意的是對private方法的mockit
PowerMockito.doNothing().when(service,"checkPrivateExist","powermock");io
以及對exist方法調用過程的驗證class
Mockito.verify(service).checkPublicExist("powermock");
PowerMockito.verifyPrivate(service).invoke("checkPrivateExist","powermock");test