单元测试如何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
    }


}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值