0


单元测试如何mock当前类的其他私有方法调用

  1. 在我们编写单元测试案例的过程中,如果存在mock当前类内其他私有方法的需求,该如何实现呢?

(1)mock有返回值的私有方法

a.首先需要在测试类上添加RunWith注解

  1. @RunWith(PowerMockito.class)

b.其次需要在测试类添加PrepareForTest注解

  1. @PrepareForTest(待测试的类名称)

c.在测试方法中使用spy方法创建测试对象

d.对需要模拟的方法执行模拟

PowerMockito.doReturn(返回值).when(测试对象,测试对象的私有方法,私有方法参数);

此处需要注意一定不要写做下面这样,写成这样无法达到模拟效果

//PowerMockito.when(测试对象,测试对象的私有方法).doReturn(返回值);

案例如下:

  1. public class UserService{
  2. public void searchUser(){
  3. System.out.println("search user begin ...");
  4. getUser(user);
  5. System.out.println("search user end ...");
  6. }
  7. private User getUser(){
  8. System.out.println("get user begin ...");
  9. User user=new User();
  10. System.out.println("get user end ...");
  11. return user;
  12. }
  13. }
  14. @RunWith(PowerMockRunner.class)
  15. @PrepareForTest(UserService.class)
  16. public class UserServiceTest{
  17. @Test
  18. public void testSearchUser(){
  19. UserService userService=new UserService();
  20. User user=new User();
  21. UserService userService1=PowerMockito.spy(userService);
  22. try{
  23. PowerMockito.doReturn(user).when(userService1,"getUser");
  24. }catch(Exception e){
  25. e.printStackTrace();
  26. }
  27. userService1.searchUser(user);
  28. //执行结果仅输出了
  29. search user begin ...
  30. search user end ...
  31. //说明私有方法getUser()被成功Mock
  32. }
  33. }

(2)mock无返回值的私有方法

a.首先需要在测试类上添加RunWith注解

  1. @RunWith(PowerMockito.class)

b.其次需要在测试类添加PrepareForTest注解

  1. @PrepareForTest(待测试的类名称)

c.在测试方法中使用spy方法创建测试对象

d.对需要模拟的方法执行模拟

PowerMockito.doNothing().when(测试对象,测试对象的私有方法,私有方法参数);

PowerMockito.doAnswer(answer).when(测试对象,测试对象的私有方法,私有方法参数);

案例如下:

  1. public class UserService{
  2. public void addUser(User user){
  3. System.out.println("add user begin ...");
  4. insertUser(user);
  5. System.out.println("add user end ...");
  6. }
  7. private void insertUser(User user){
  8. System.out.println("insert user success");
  9. }
  10. }
  11. @RunWith(PowerMockRunner.class)
  12. @PrepareForTest(UserService.class)
  13. public class UserServiceTest{
  14. @Test
  15. public void testAddUser(){
  16. UserService userService=new UserService();
  17. User user=new User();
  18. UserService userService1=PowerMockito.spy(userService);
  19. try{
  20. PowerMockito.doNothing().when(userService1,"insertUser",user);
  21. }catch(Exception e){
  22. e.printStackTrace();
  23. }
  24. userService1.addUser(user);
  25. //执行结果仅输出了
  26. add user begin ...
  27. add user end ...
  28. //说明私有方法insertUser(user)被成功Mock
  29. }
  30. @Test
  31. public void testAddUser2(){
  32. UserService userService=new UserService();
  33. User user=new User();
  34. UserService userService1=PowerMockito.spy(userService);
  35. try{
  36. Answer answer=new Answer(){
  37. public Object answer(InvocationOnMock invocationOnMock) throws Throwable{
  38. return null;
  39. }
  40. }
  41. PowerMockito.doAnswer(answer).when(userService1,"insertUser",user);
  42. }catch(Exception e){
  43. e.printStackTrace();
  44. }
  45. userService1.addUser(user);
  46. //执行结果仅输出了
  47. add user begin ...
  48. add user end ...
  49. //说明私有方法insertUser(user)被成功Mock
  50. }
  51. }

本文转载自: https://blog.csdn.net/wangxinzhen/article/details/121162753
版权归原作者 wangxinzhen 所有, 如有侵权,请联系我们删除。

“单元测试如何mock当前类的其他私有方法调用”的评论:

还没有评论