0


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

    在我们编写单元测试案例的过程中,如果存在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
    }

}

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

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

还没有评论