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

您所在的位置:网站首页 java如何调用其他类的方法 单元测试如何mock当前类的其他私有方法调用

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

2024-06-14 16:08| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3