Mockito+PowerMock+Junit单元测试

打印 上一主题 下一主题

主题 789|帖子 789|积分 2377

一、单元测试用途

1、一样平常开发团队要求规范,需要对开发需求代码进行单元测试并要求行覆盖率到达要求,DevOps流水线也会开设相关门禁阀值阻断代码提交,一般新增代码行覆盖率80%左右。
二、Mock测试介绍

1、Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类大概接口有依靠,它能够帮你模仿这些依靠,并帮你验证所调用的依靠的举动。

2、Mock 测试就是在测试运动中,对于某些不容易构造大概不容易获取的比较复杂的数据/场景,用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。
3、Mock重要作用
   Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。
  Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类大概接口有依靠,它能够帮你模仿这些依靠,并帮你验证所调用的依靠的举动。
  三、Mock测试所需依靠

 1、主要引入mockito-core/powermock-core
  1.         <dependency>
  2.             <groupId>org.mockito</groupId>
  3.             <artifactId>mockito-core</artifactId>
  4.             <version>4.5.1</version>
  5.             <scope>test</scope>
  6.         </dependency>
  7.         <dependency>
  8.             <groupId>org.powermock</groupId>
  9.             <artifactId>powermock-core</artifactId>
  10.             <version>2.0.9</version>
  11.         </dependency>
  12.         <dependency>
  13.             <groupId>org.powermock</groupId>
  14.             <artifactId>powermock-module-junit4</artifactId>
  15.             <version>2.0.9</version>
  16.         </dependency>
  17.         <dependency>
  18.             <groupId>org.powermock</groupId>
  19.             <artifactId>powermock-api-mockito2</artifactId>
  20.             <version>2.0.9</version>
  21.             <scope>test</scope>
  22.         </dependency>
复制代码
   Mockito和PowerMock都是单元测试模仿框架,用于模仿被测试类的依靠项。Mockito基于动态代理的方式实现,而PowerMock在Mockito基础上增长了类加载器以及字节码篡改技能,使其可以实现对private/static/final方法的Mock 
  四、Mock的核心功能


1、Mock对象创建
   Mockito.mock(List.class); // Mock对象创建
  1. public class VerifyMockExample {
  2.     @Test
  3.     public void testVerifyMock() {
  4.         List<String> mockList = Mockito.mock(List.class);
  5.         // 调用Mock对象的方法
  6.         mockList.add("testCode");
  7.         mockList.size();
  8.         // 验证mockList.add("test")是否被调用过一次
  9.         Mockito.verify(mockList,Mockito.times(1)).add("testCode");
  10.         // 验证size()方法是否被调用过
  11.         Mockito.verify(mockList,Mockito.times(1)).size();
  12.         Assert.assertFalse(mockList.size()==1);
  13.     }
  14. }
复制代码
  verify系列方法 
    Mockito.verify/Mockito.times()验证调用次数 
  ·verify(mock).methodCall():验证方法被调用
  · verify(mock, times(n)).methodCall():验证方法被调用n次
  · verify(mock, never()).methodCall():验证方法从未被调用
  大概是通过注解来实现创建
  1.     @Mock
  2.     private UserInfoMapper mockUserInfoMapper;
  3.     @InjectMocks
  4.     private UserInfoServiceImpl userInfoServiceImplUnderTest;
复制代码

  1.     @Test
  2.     public void testVerifyMock2(){
  3.         List<String> mockList = Mockito.mock(List.class);
  4.         mockList.add("Code1");
  5.         mockList.add("Code2");
  6.         // 验证是否调用两次
  7.         Mockito.verify(mockList,Mockito.times(2));
  8.     }
复制代码
  1. // 验证这个方法从没有被调用过
  2. Mockito.verify(userMapper, Mockito.never()).getUserById(1);
  3. userMapper.getUserById(1);
  4. // 验证这个方法至少调用了1次
  5. Mockito.verify(userMapper, Mockito.atLeastOnce()).getUserById(1);
  6. userMapper.getUserById(1);
  7. // 验证当前方法调用了2次
  8. Mockito.verify(userMapper, Mockito.times(2)).getUserById(1);
复制代码
   Mockito.when()利用when和thenReturn方法配置Mock对象的举动
    Mockito.when( 对象.方法名 ).thenReturn( 自定义结果) //当调用了某个 Mock 对象的方法时,就回传我们想要的自定义结果。 
    thenReturn系列方法 
    //当利用任何整数值调用 userService 的 getUserById 方法时,就回传一个名字为 I'm mock 3 的 User 对象。
Mockito.when(userService.getUserById(Mockito.anyInt)).thenReturn( newUser( 3, "I'm mock"));
//限制只有当参数的数字是 3 时,才会回传名字为 I'm mock 3 的 user 对象。
Mockito.when(userService.getUserById( 3)).thenReturn( newUser( 3, "I'm mock"));
//当调用 userService 的 insertUser 方法时,不管传进来的 user 是什么,都回传 100。
Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn( 100);
    thenThrow系列方法 
    //当调用 userService 的 getUserById 时的参数是 8 时,抛出一个 RuntimeException。
Mockito.when(userService.getUserById( 8)).thenThrow( new RuntimeException( "mock throw exception"));
//如果方法没有返回值的话(即方法定义为 public void myMethod {...}),要改用 doThrow 抛出 Exception。
Mockito.doThrow( new RuntimeException( "mock throw exception")).when(userService.print);
   
  1.     @Test
  2.     public void testVerifyMock3(){
  3.         List<String> mockList = Mockito.mock(List.class);
  4.         // 设置Mock对象的预期行为
  5.         Mockito.when(mockList.get(0)).thenReturn("mockedValue");
  6.         // 断言验证返回值
  7.         Assert.assertEquals("mockedValue",mockList.get(0));
  8.     }
复制代码
实战案例:测试一个UserInfoServiceImpl层saveUser()方法.
原始方法:
  1.     @Transactional
  2.     @Override
  3.     public void saveUser(UserInfo userInfo){
  4.         userInfoMapper.saveUser(userInfo);
  5.     }
复制代码
单元测试:
  1.     @Test
  2.     public void testSaveUser() {
  3.         // Setup
  4.         final UserInfo userInfo = new UserInfo();
  5.         userInfo.setId(0);
  6.         userInfo.setUserName("userName");
  7.         userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  8.         userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  9.         // Run the test
  10.         userInfoServiceImplUnderTest.saveUser(userInfo);
  11.         // Verify the results
  12.         Mockito.verify(mockUserInfoMapper).saveUser(new UserInfo());
  13.     }
复制代码
原始方法:
  1.     @Override
  2.     public List<UserInfo> queryListByUserName(String userName) {
  3.         return userInfoMapper.queryListByUserName(userName);
  4.     }
复制代码
 单元测试方法:
  1.     @Test
  2.     public void testQueryListByUserName() {
  3.         // Setup
  4.         final UserInfo userInfo = new UserInfo();
  5.         userInfo.setId(0);
  6.         userInfo.setUserName("userName");
  7.         userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  8.         userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  9.         final List<UserInfo> expectedResult = Arrays.asList(userInfo);
  10.         // Configure UserInfoMapper.queryListByUserName(...).
  11.         final UserInfo userInfo1 = new UserInfo();
  12.         userInfo1.setId(0);
  13.         userInfo1.setUserName("userName");
  14.         userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  15.         userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  16.         final List<UserInfo> userInfos = Arrays.asList(userInfo1);
  17.         when(mockUserInfoMapper.queryListByUserName("userName")).thenReturn(userInfos);
  18.         // Run the test
  19.         final List<UserInfo> result = userInfoServiceImplUnderTest.queryListByUserName("userName");
  20.         // Verify the results
  21.         assertThat(result).isEqualTo(expectedResult);
  22.     }
  23.     @Test
  24.     public void testQueryListByUserName_UserInfoMapperReturnsNoItems() {
  25.         // Setup
  26.         when(mockUserInfoMapper.queryListByUserName("userName")).thenReturn(Collections.emptyList());
  27.         // Run the test
  28.         final List<UserInfo> result = userInfoServiceImplUnderTest.queryListByUserName("userName");
  29.         // Verify the results
  30.         assertThat(result).isEqualTo(Collections.emptyList());
  31.     }
复制代码
 原始方法:
  1.     @Override
  2.     public List<UserInfo> queryUserInfoList(String createTime, List<Integer> idList) {
  3.         return userInfoMapper.queryListByIds(createTime,idList);
  4.     }
复制代码
 单元测试方法:
  1.     @Test
  2.     public void testQueryUserInfoList() {
  3.         // Setup
  4.         final UserInfo userInfo = new UserInfo();
  5.         userInfo.setId(0);
  6.         userInfo.setUserName("userName");
  7.         userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  8.         userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  9.         final List<UserInfo> expectedResult = Arrays.asList(userInfo);
  10.         // Configure UserInfoMapper.queryListByIds(...).
  11.         final UserInfo userInfo1 = new UserInfo();
  12.         userInfo1.setId(0);
  13.         userInfo1.setUserName("userName");
  14.         userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  15.         userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  16.         final List<UserInfo> userInfos = Arrays.asList(userInfo1);
  17.         when(mockUserInfoMapper.queryListByIds("createTime", Arrays.asList(0))).thenReturn(userInfos);
  18.         // Run the test
  19.         final List<UserInfo> result = userInfoServiceImplUnderTest.queryUserInfoList("createTime", Arrays.asList(0));
  20.         // Verify the results
  21.         assertThat(result).isEqualTo(expectedResult);
  22.     }
  23.     @Test
  24.     public void testQueryUserInfoList_UserInfoMapperReturnsNoItems() {
  25.         // Setup
  26.         when(mockUserInfoMapper.queryListByIds("createTime", Arrays.asList(0))).thenReturn(Collections.emptyList());
  27.         // Run the test
  28.         final List<UserInfo> result = userInfoServiceImplUnderTest.queryUserInfoList("createTime", Arrays.asList(0));
  29.         // Verify the results
  30.         assertThat(result).isEqualTo(Collections.emptyList());
  31.     }
复制代码
  原始方法:Controller层,MockMvc
  mockMvc.perform(request):执行一个HTTP哀求,并返回ResultActions对象。
ResultActions.andExpect(expected):验证哀求的处理结果,如状态码、响应体等。
ResultActions.andDo(handler):处理哀求的响应,如将响应体写入文件等。
ResultActions.andReturn():返回已执行哀求的结果,以便直接访问结果。
MockMvc.perform(request).andExpect(expected).andDo(handler).andReturn():链式调用,执行哀求、验证结果并处理响应,返回结果。
  1. @Slf4j
  2. @RestController
  3. public class UserInfoController {
  4.     @Autowired
  5.     private UserInfoService userInfoService;
  6.     /**
  7.      * 查询全部列表
  8.      * @return
  9.      */
  10.     @RequestMapping("/boot/query/users")
  11.     public List<UserInfo> getUserInfoList(){
  12.         List<UserInfo> list = userInfoService.list();
  13.         return list;
  14.     }
  15.     /**
  16.      * 保存用户信息
  17.      * @return
  18.      */
  19.     @RequestMapping("/boot/save/user")
  20.     public String saveUser(){
  21.         try {
  22.             UserInfo user=new UserInfo();
  23.             user.setUserName("MyBatis Log Free");
  24.             userInfoService.save(user);
  25.         } catch (Exception e) {
  26.             log.error("save user error", e);
  27.             throw new GlobalException("save user error");
  28.         }
  29.         return "success";
  30.     }
  31.     @RequestMapping("/boot/query/users/ids")
  32.     public List<UserInfo> getUserInfoListIds(){
  33.         List<Integer> list = Arrays.asList(1, 3, 5);
  34.         String createTime="2022-09-05 15:11:21";
  35.         List<UserInfo> userInfos = userInfoService.queryUserInfoList(createTime,list);
  36.         return userInfos;
  37.     }
  38.     @RequestMapping("/boot/query/users/like")
  39.     public List<UserInfo> getUserInfoListLike(){
  40.         List<UserInfo> infoList = userInfoService.queryListByUserName("A");
  41.         return infoList;
  42.     }
  43.     @RequestMapping("/boot/save/userinfo")
  44.     public void saveUserInfo(){
  45.         UserInfo userInfo = new UserInfo();
  46.         userInfo.setId(5);
  47.         userInfo.setUserName("Puck");
  48.         Date startTime = new Date();
  49.         Date endTime = new Date();
  50.         userInfo.setCreateTime(startTime);
  51.         userInfo.setUpdateTime(endTime);
  52.         userInfoService.saveUser(userInfo);
  53.     }
  54. }
复制代码
 单元测试方法如下:
  1. @RunWith(SpringRunner.class)
  2. @WebMvcTest(UserInfoController.class)
  3. public class UserInfoControllerTest {
  4.     @Autowired
  5.     private MockMvc mockMvc;
  6.     @MockBean
  7.     private UserInfoService mockUserInfoService;
  8.     @Test
  9.     public void testGetUserInfoList() throws Exception {
  10.         // Setup
  11.         // Configure UserInfoService.list(...).
  12.         final UserInfo userInfo = new UserInfo();
  13.         userInfo.setId(0);
  14.         userInfo.setUserName("MyBatis Log Free");
  15.         userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  16.         userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  17.         final List<UserInfo> userInfos = Arrays.asList(userInfo);
  18.         when(mockUserInfoService.list()).thenReturn(userInfos);
  19.         // Run the test
  20.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users")
  21.                         .accept(MediaType.APPLICATION_JSON))
  22.                 .andReturn().getResponse();
  23.         // Verify the results
  24.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  25. //        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
  26.     }
  27.     @Test
  28.     public void testGetUserInfoList_UserInfoServiceReturnsNoItems() throws Exception {
  29.         // Setup
  30.         when(mockUserInfoService.list()).thenReturn(Collections.emptyList());
  31.         // Run the test
  32.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users")
  33.                         .accept(MediaType.APPLICATION_JSON))
  34.                 .andReturn().getResponse();
  35.         // Verify the results
  36.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  37.         assertThat(response.getContentAsString()).isEqualTo("[]");
  38.     }
  39.     @Test
  40.     public void testSaveUser() throws Exception {
  41.         // Setup
  42.         when(mockUserInfoService.save(new UserInfo())).thenReturn(false);
  43.         // Run the test
  44.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/save/user")
  45.                         .accept(MediaType.APPLICATION_JSON))
  46.                 .andReturn().getResponse();
  47.         // Verify the results
  48.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  49.         assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
  50.         verify(mockUserInfoService).save(new UserInfo());
  51.     }
  52.     @Test
  53.     public void testGetUserInfoListIds() throws Exception {
  54.         // Setup
  55.         // Configure UserInfoService.queryUserInfoList(...).
  56.         final UserInfo userInfo = new UserInfo();
  57.         userInfo.setId(0);
  58.         userInfo.setUserName("MyBatis Log Free");
  59.         userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  60.         userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  61.         final List<UserInfo> userInfos = Arrays.asList(userInfo);
  62.         when(mockUserInfoService.queryUserInfoList("2022-09-05 15:11:21", Arrays.asList(0))).thenReturn(userInfos);
  63.         // Run the test
  64.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/ids")
  65.                         .accept(MediaType.APPLICATION_JSON))
  66.                 .andReturn().getResponse();
  67.         // Verify the results
  68.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  69.         assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
  70.     }
  71.     @Test
  72.     public void testGetUserInfoListIds_UserInfoServiceReturnsNoItems() throws Exception {
  73.         // Setup
  74.         when(mockUserInfoService.queryUserInfoList("2022-09-05 15:11:21", Arrays.asList(0)))
  75.                 .thenReturn(Collections.emptyList());
  76.         // Run the test
  77.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/ids")
  78.                         .accept(MediaType.APPLICATION_JSON))
  79.                 .andReturn().getResponse();
  80.         // Verify the results
  81.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  82.         assertThat(response.getContentAsString()).isEqualTo("[]");
  83.     }
  84.     @Test
  85.     public void testGetUserInfoListLike() throws Exception {
  86.         // Setup
  87.         // Configure UserInfoService.queryListByUserName(...).
  88.         final UserInfo userInfo = new UserInfo();
  89.         userInfo.setId(0);
  90.         userInfo.setUserName("MyBatis Log Free");
  91.         userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  92.         userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
  93.         final List<UserInfo> userInfos = Arrays.asList(userInfo);
  94.         when(mockUserInfoService.queryListByUserName("A")).thenReturn(userInfos);
  95.         // Run the test
  96.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/like")
  97.                         .accept(MediaType.APPLICATION_JSON))
  98.                 .andReturn().getResponse();
  99.         // Verify the results
  100.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  101.         assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
  102.     }
  103.     @Test
  104.     public void testGetUserInfoListLike_UserInfoServiceReturnsNoItems() throws Exception {
  105.         // Setup
  106.         when(mockUserInfoService.queryListByUserName("A")).thenReturn(Collections.emptyList());
  107.         // Run the test
  108.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/like")
  109.                         .accept(MediaType.APPLICATION_JSON))
  110.                 .andReturn().getResponse();
  111.         // Verify the results
  112.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  113.         assertThat(response.getContentAsString()).isEqualTo("[]");
  114.     }
  115.     @Test
  116.     public void testSaveUserInfo() throws Exception {
  117.         // Setup
  118.         // Run the test
  119.         final MockHttpServletResponse response = mockMvc.perform(get("/boot/save/userinfo")
  120.                         .accept(MediaType.APPLICATION_JSON))
  121.                 .andReturn().getResponse();
  122.         // Verify the results
  123.         assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
  124.         assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
  125.         verify(mockUserInfoService).saveUser(new UserInfo());
  126.     }
  127. }
复制代码
   @Mock用于模仿不属于 Spring 上下文的对象,而@MockBean用于模仿属于 Spring Boot 应用程序中的 Spring 上下文的对象。@MockBean提供与 Spring Boot 测试框架的无缝集成,并允许在测试期间用模仿对象轻松替换实际 bean 
    Mockito提供了多种参数匹配器(Matchers)用于更灵活的验证和配置举动:
  1. import static org.mockito.ArgumentMatchers.*;
  2. when(mockRepository.findById(anyInt())).thenReturn(Optional.of(user));
  3. verify(mockRepository).findById(eq(1));
复制代码
  
  常见的匹配器包罗:
    ·any():匹配任何参数
    · anyInt():匹配任何整数参数
    · eq(value):匹配特定值
    · isNull():匹配null值
    · notNull():匹配非null值
    Mock非常
  1. Mockito.when(userMapper.getUserById(Mockito.anyInt())).thenThrow(new RuntimeException("运行时错误"));
  2. Assertions.assertThrowsExactly(RuntimeException.class, () -> userMapper.getUserById(1));
  3. // 对于没有返回值的方法,不能使用thenThrow()来抛出异常,可以使用doThrow()来抛出异常。
  4. Mockito.doThrow(new RuntimeException("运行时错误")).when(userMapper).getUserById(1);
  5. Assertions.assertThrowsExactly(RuntimeException.class, () -> userMapper.getUserById(1));
复制代码
  @MockBean 是 Spring Boot 提供的注解,它用于在测试中创建一个 mock 对象,并将其注入到 Spring 上下文中,替换掉原来的真实 Bean。 需要利用SpringJUnit4ClassRunner.class之类的注解
    @Mock: 用于取代Mockito.mock创建mock对象,创建一个Mock实例,需要基于JUnit5环境。@InjectMocks: 创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
  你要测试哪个类(如TemplateUserServiceImpl ),那么就用 @InjectMocks注解;被测试的类中通过 @Autowired注解注入了几个,那么测试类里面就用@Mock注解创建几个实例!
  原始代码:
  1. @Service
  2. public class TemplateUserServiceImpl implements TemplateUserService {
  3.     @Autowired
  4.     private NamedParameterJdbcTemplate jdbcTemplate;
  5.     @Transactional
  6.     @Override
  7.     public void saveUser() {
  8.         UserInfo userInfo = new UserInfo();
  9.         userInfo.setId(7);
  10.         userInfo.setUserName("Boot");
  11.         Date startTime = new Date();
  12.         Date endTime = new Date();
  13.         userInfo.setCreateTime(startTime);
  14.         userInfo.setUpdateTime(endTime);
  15.         // JdbcTemplate的写入datetime,使用in方式
  16. //        String sql="insert into user_info(user_name,create_time,update_time) values(:user_name,:create_time,:update_time)";
  17.         String sql="insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)";
  18.         SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(userInfo);
  19. //        HashMap paramMap = new HashMap<>();
  20. //        paramMap.put("user_name",userInfo.getUserName());
  21. //        paramMap.put("create_time",userInfo.getCreateTime());
  22. //        paramMap.put("update_time",userInfo.getUpdateTime());
  23. //        jdbcTemplate.update(sql,paramMap);
  24.         jdbcTemplate.update(sql,sqlParameterSource);
  25.     }
  26. }
复制代码
 对应单元测试代码:
  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.mockito.InjectMocks;
  4. import org.mockito.Mock;
  5. import org.mockito.junit.MockitoJUnitRunner;
  6. import org.springframework.dao.DataAccessException;
  7. import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
  8. import org.springframework.jdbc.core.namedparam.SqlParameterSource;
  9. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  10. import static org.mockito.ArgumentMatchers.any;
  11. import static org.mockito.ArgumentMatchers.eq;
  12. import static org.mockito.Mockito.verify;
  13. import static org.mockito.Mockito.when;
  14. @RunWith(MockitoJUnitRunner.class)
  15. public class TemplateUserServiceImplTest {
  16.     @Mock
  17.     private NamedParameterJdbcTemplate mockJdbcTemplate;
  18.     @InjectMocks
  19.     private TemplateUserServiceImpl templateUserServiceImplUnderTest;
  20.     @Test
  21.     public void testSaveUser() {
  22.         // Setup
  23.         // Run the test
  24.         templateUserServiceImplUnderTest.saveUser();
  25.         // Verify the results
  26.         verify(mockJdbcTemplate).update(
  27.                 eq("insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)"),
  28.                 any(SqlParameterSource.class));
  29.     }
  30.     @Test
  31.     public void testSaveUser_NamedParameterJdbcTemplateThrowsDataAccessException() {
  32.         // Setup
  33.         when(mockJdbcTemplate.update(
  34.                 eq("insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)"),
  35.                 any(SqlParameterSource.class))).thenThrow(DataAccessException.class);
  36.         // Run the test
  37.         assertThatThrownBy(() -> templateUserServiceImplUnderTest.saveUser()).isInstanceOf(DataAccessException.class);
  38.     }
  39. }
复制代码
  @MockBean 和 @SpyBean和@Spy以及@Mock的利用场景和区别 
   

五、单元测试生成插件

1、IDEA中安装Squaretest插件利用

文件右键即可生成对应单元测试,需要修改测试用例,满足业务诉求。

 
2、破解插件过程 

idea版本:

下载字节码编译工具:jclasslib。
jclasslib下载地点 

JAR包路径:C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2023.3\plugins\Squaretest 

 说明:不用版本的Squaretest插件的jar包名称或许不一样,找空间最大的那个,约15M左右的那个。

最后一步点击生存按钮,选择“overwrite”时,此时一定要将idea关闭,否则会生存失败的. 

最后破解乐成,可以正常利用。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表