在我们编写单元测试案例的过程中,如果存在mock当前类内其他私有方法的需求,该如何实现呢?
(1)mock有返回值的私有方法
a.首先需要在测试类上添加RunWith注解
@RunWith(PowerMockito.class)
b.其次需要在测试类添加PrepareForTest注解
@PrepareForTest(待测试的类名称)
c.在测试方法中使用spy方法创建测试对象
d.对需要模拟的方法执行模拟
PowerMockito.doReturn(返回值).when(测试对象,测试对象的私有方法,私有方法参数);
此处需要注意一定不要写做下面这样,写成这样无法达到模拟效果
//PowerMockito.when(测试对象,测试对象的私有方法).doReturn(返回值);
案例如下:
public class UserService{
public void searchUser(){
System.out.println("search user begin ...");
getUser(user);
System.out.println("search user end ...");
}
private User getUser(){
System.out.println("get user begin ...");
User user=new User();
System.out.println("get user end ...");
return user;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(UserService.class)
public class UserServiceTest{
@Test
public void testSearchUser(){
UserService userService=new UserService();
User user=new User();
UserService userService1=PowerMockito.spy(userService);
try{
PowerMockito.doReturn(user).when(userService1,"getUser");
}catch(Exception e){
e.printStackTrace();
}
userService1.searchUser(user);
//执行结果仅输出了
search user begin ...
search user end ...
//说明私有方法getUser()被成功Mock
}
}
(2)mock无返回值的私有方法
a.首先需要在测试类上添加RunWith注解
@RunWith(PowerMockito.class)
b.其次需要在测试类添加PrepareForTest注解
@PrepareForTest(待测试的类名称)
c.在测试方法中使用spy方法创建测试对象
d.对需要模拟的方法执行模拟
PowerMockito.doNothing().when(测试对象,测试对象的私有方法,私有方法参数);
或
PowerMockito.doAnswer(answer).when(测试对象,测试对象的私有方法,私有方法参数);
案例如下:
public class UserService{
public void addUser(User user){
System.out.println("add user begin ...");
insertUser(user);
System.out.println("add user end ...");
}
private void insertUser(User user){
System.out.println("insert user success");
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(UserService.class)
public class UserServiceTest{
@Test
public void testAddUser(){
UserService userService=new UserService();
User user=new User();
UserService userService1=PowerMockito.spy(userService);
try{
PowerMockito.doNothing().when(userService1,"insertUser",user);
}catch(Exception e){
e.printStackTrace();
}
userService1.addUser(user);
//执行结果仅输出了
add user begin ...
add user end ...
//说明私有方法insertUser(user)被成功Mock
}
@Test
public void testAddUser2(){
UserService userService=new UserService();
User user=new User();
UserService userService1=PowerMockito.spy(userService);
try{
Answer answer=new Answer(){
public Object answer(InvocationOnMock invocationOnMock) throws Throwable{
return null;
}
}
PowerMockito.doAnswer(answer).when(userService1,"insertUser",user);
}catch(Exception e){
e.printStackTrace();
}
userService1.addUser(user);
//执行结果仅输出了
add user begin ...
add user end ...
//说明私有方法insertUser(user)被成功Mock
}
}
版权归原作者 wangxinzhen 所有, 如有侵权,请联系我们删除。