当前位置: 首页 > news >正文

代码统计网站常德网站建设培训机构

代码统计网站,常德网站建设培训机构,开发公司提质增效的建议和措施,wordpress 成功案例一、单元测试用途 1、日常开发团队要求规范#xff0c;需要对开发需求代码进行单元测试并要求行覆盖率达到要求#xff0c;DevOps流水线也会开设相关门禁阀值阻断代码提交#xff0c;一般新增代码行覆盖率80%左右。 二、Mock测试介绍 1、Mock是为了解决不同的单元之间由于…一、单元测试用途 1、日常开发团队要求规范需要对开发需求代码进行单元测试并要求行覆盖率达到要求DevOps流水线也会开设相关门禁阀值阻断代码提交一般新增代码行覆盖率80%左右。 二、Mock测试介绍 1、Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以Mock既能出现在单元测试中也会出现在集成测试、系统测试过程中。Mock 最大的功能是帮你把单元测试的耦合分解开如果你的代码对另一个类或者接口有依赖它能够帮你模拟这些依赖并帮你验证所调用的依赖的行为。 2、Mock 测试就是在测试活动中对于某些不容易构造或者不容易获取的比较复杂的数据/场景用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。 3、Mock重要作用 Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以Mock既能出现在单元测试中也会出现在集成测试、系统测试过程中。 Mock 最大的功能是帮你把单元测试的耦合分解开如果你的代码对另一个类或者接口有依赖它能够帮你模拟这些依赖并帮你验证所调用的依赖的行为。 三、Mock测试所需依赖 1、主要引入mockito-core/powermock-core dependencygroupIdorg.mockito/groupIdartifactIdmockito-core/artifactIdversion4.5.1/versionscopetest/scope/dependencydependencygroupIdorg.powermock/groupIdartifactIdpowermock-core/artifactIdversion2.0.9/version/dependencydependencygroupIdorg.powermock/groupIdartifactIdpowermock-module-junit4/artifactIdversion2.0.9/version/dependencydependencygroupIdorg.powermock/groupIdartifactIdpowermock-api-mockito2/artifactIdversion2.0.9/versionscopetest/scope/dependency Mockito和PowerMock都是单元测试模拟框架用于模拟被测试类的依赖项。Mockito基于动态代理的方式实现而PowerMock在Mockito基础上增加了类加载器以及字节码篡改技术使其可以实现对private/static/final方法的Mock  四、Mock的核心功能 1、Mock对象创建 Mockito.mock(List.class); // Mock对象创建 public class VerifyMockExample {Testpublic void testVerifyMock() {ListString mockList Mockito.mock(List.class);// 调用Mock对象的方法mockList.add(testCode);mockList.size();// 验证mockList.add(test)是否被调用过一次Mockito.verify(mockList,Mockito.times(1)).add(testCode);// 验证size()方法是否被调用过Mockito.verify(mockList,Mockito.times(1)).size();Assert.assertFalse(mockList.size()1);} } verify系列方法  Mockito.verify/Mockito.times()验证调用次数  ·verify(mock).methodCall()验证方法被调用 · verify(mock, times(n)).methodCall()验证方法被调用n次 · verify(mock, never()).methodCall()验证方法从未被调用 或者是通过注解来实现创建 Mockprivate UserInfoMapper mockUserInfoMapper;InjectMocksprivate UserInfoServiceImpl userInfoServiceImplUnderTest; Testpublic void testVerifyMock2(){ListString mockList Mockito.mock(List.class);mockList.add(Code1);mockList.add(Code2);// 验证是否调用两次Mockito.verify(mockList,Mockito.times(2));} // 验证这个方法从没有被调用过Mockito.verify(userMapper, Mockito.never()).getUserById(1);userMapper.getUserById(1);// 验证这个方法至少调用了1次Mockito.verify(userMapper, Mockito.atLeastOnce()).getUserById(1);userMapper.getUserById(1);// 验证当前方法调用了2次Mockito.verify(userMapper, Mockito.times(2)).getUserById(1); Mockito.when()使用when和thenReturn方法配置Mock对象的行为 Mockito.when( 对象.方法名 ).thenReturn( 自定义结果) //当调用了某个 Mock 对象的方法时就回传我们想要的自定义结果。  thenReturn系列方法  //当使用任何整数值调用 userService 的 getUserById 方法时就回传一个名字为 Im mock 3 的 User 对象。 Mockito.when(userService.getUserById(Mockito.anyInt)).thenReturn( newUser( 3, Im mock)); //限制只有当参数的数字是 3 时才会回传名字为 Im mock 3 的 user 对象。 Mockito.when(userService.getUserById( 3)).thenReturn( newUser( 3, Im 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);   Testpublic void testVerifyMock3(){ListString mockList Mockito.mock(List.class);// 设置Mock对象的预期行为Mockito.when(mockList.get(0)).thenReturn(mockedValue);// 断言验证返回值Assert.assertEquals(mockedValue,mockList.get(0));} 实战案例测试一个UserInfoServiceImpl层saveUser()方法. 原始方法 TransactionalOverridepublic void saveUser(UserInfo userInfo){userInfoMapper.saveUser(userInfo);} 单元测试 Testpublic void testSaveUser() {// Setupfinal UserInfo userInfo new UserInfo();userInfo.setId(0);userInfo.setUserName(userName);userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());// Run the testuserInfoServiceImplUnderTest.saveUser(userInfo);// Verify the resultsMockito.verify(mockUserInfoMapper).saveUser(new UserInfo());} 原始方法 Overridepublic ListUserInfo queryListByUserName(String userName) {return userInfoMapper.queryListByUserName(userName);} 单元测试方法 Testpublic void testQueryListByUserName() {// Setupfinal UserInfo userInfo new UserInfo();userInfo.setId(0);userInfo.setUserName(userName);userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo expectedResult Arrays.asList(userInfo);// Configure UserInfoMapper.queryListByUserName(...).final UserInfo userInfo1 new UserInfo();userInfo1.setId(0);userInfo1.setUserName(userName);userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo userInfos Arrays.asList(userInfo1);when(mockUserInfoMapper.queryListByUserName(userName)).thenReturn(userInfos);// Run the testfinal ListUserInfo result userInfoServiceImplUnderTest.queryListByUserName(userName);// Verify the resultsassertThat(result).isEqualTo(expectedResult);}Testpublic void testQueryListByUserName_UserInfoMapperReturnsNoItems() {// Setupwhen(mockUserInfoMapper.queryListByUserName(userName)).thenReturn(Collections.emptyList());// Run the testfinal ListUserInfo result userInfoServiceImplUnderTest.queryListByUserName(userName);// Verify the resultsassertThat(result).isEqualTo(Collections.emptyList());} 原始方法 Overridepublic ListUserInfo queryUserInfoList(String createTime, ListInteger idList) {return userInfoMapper.queryListByIds(createTime,idList);} 单元测试方法 Testpublic void testQueryUserInfoList() {// Setupfinal UserInfo userInfo new UserInfo();userInfo.setId(0);userInfo.setUserName(userName);userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo expectedResult Arrays.asList(userInfo);// Configure UserInfoMapper.queryListByIds(...).final UserInfo userInfo1 new UserInfo();userInfo1.setId(0);userInfo1.setUserName(userName);userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo userInfos Arrays.asList(userInfo1);when(mockUserInfoMapper.queryListByIds(createTime, Arrays.asList(0))).thenReturn(userInfos);// Run the testfinal ListUserInfo result userInfoServiceImplUnderTest.queryUserInfoList(createTime, Arrays.asList(0));// Verify the resultsassertThat(result).isEqualTo(expectedResult);}Testpublic void testQueryUserInfoList_UserInfoMapperReturnsNoItems() {// Setupwhen(mockUserInfoMapper.queryListByIds(createTime, Arrays.asList(0))).thenReturn(Collections.emptyList());// Run the testfinal ListUserInfo result userInfoServiceImplUnderTest.queryUserInfoList(createTime, Arrays.asList(0));// Verify the resultsassertThat(result).isEqualTo(Collections.emptyList());} 原始方法Controller层MockMvc mockMvc.perform(request)执行一个HTTP请求并返回ResultActions对象。 ResultActions.andExpect(expected)验证请求的处理结果如状态码、响应体等。 ResultActions.andDo(handler)处理请求的响应如将响应体写入文件等。 ResultActions.andReturn()返回已执行请求的结果以便直接访问结果。 MockMvc.perform(request).andExpect(expected).andDo(handler).andReturn()链式调用执行请求、验证结果并处理响应返回结果。 Slf4j RestController public class UserInfoController {Autowiredprivate UserInfoService userInfoService;/*** 查询全部列表* return*/RequestMapping(/boot/query/users)public ListUserInfo getUserInfoList(){ListUserInfo list userInfoService.list();return list;}/*** 保存用户信息* return*/RequestMapping(/boot/save/user)public String saveUser(){try {UserInfo usernew UserInfo();user.setUserName(MyBatis Log Free);userInfoService.save(user);} catch (Exception e) {log.error(save user error, e);throw new GlobalException(save user error);}return success;}RequestMapping(/boot/query/users/ids)public ListUserInfo getUserInfoListIds(){ListInteger list Arrays.asList(1, 3, 5);String createTime2022-09-05 15:11:21;ListUserInfo userInfos userInfoService.queryUserInfoList(createTime,list);return userInfos;}RequestMapping(/boot/query/users/like)public ListUserInfo getUserInfoListLike(){ListUserInfo infoList userInfoService.queryListByUserName(A);return infoList;}RequestMapping(/boot/save/userinfo)public void saveUserInfo(){UserInfo userInfo new UserInfo();userInfo.setId(5);userInfo.setUserName(Puck);Date startTime new Date();Date endTime new Date();userInfo.setCreateTime(startTime);userInfo.setUpdateTime(endTime);userInfoService.saveUser(userInfo);} } 单元测试方法如下: RunWith(SpringRunner.class) WebMvcTest(UserInfoController.class) public class UserInfoControllerTest {Autowiredprivate MockMvc mockMvc;MockBeanprivate UserInfoService mockUserInfoService;Testpublic void testGetUserInfoList() throws Exception {// Setup// Configure UserInfoService.list(...).final UserInfo userInfo new UserInfo();userInfo.setId(0);userInfo.setUserName(MyBatis Log Free);userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo userInfos Arrays.asList(userInfo);when(mockUserInfoService.list()).thenReturn(userInfos);// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/query/users).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); // assertThat(response.getContentAsString()).isEqualTo(expectedResponse);}Testpublic void testGetUserInfoList_UserInfoServiceReturnsNoItems() throws Exception {// Setupwhen(mockUserInfoService.list()).thenReturn(Collections.emptyList());// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/query/users).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo([]);}Testpublic void testSaveUser() throws Exception {// Setupwhen(mockUserInfoService.save(new UserInfo())).thenReturn(false);// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/save/user).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo(expectedResponse);verify(mockUserInfoService).save(new UserInfo());}Testpublic void testGetUserInfoListIds() throws Exception {// Setup// Configure UserInfoService.queryUserInfoList(...).final UserInfo userInfo new UserInfo();userInfo.setId(0);userInfo.setUserName(MyBatis Log Free);userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo userInfos Arrays.asList(userInfo);when(mockUserInfoService.queryUserInfoList(2022-09-05 15:11:21, Arrays.asList(0))).thenReturn(userInfos);// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/query/users/ids).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo(expectedResponse);}Testpublic void testGetUserInfoListIds_UserInfoServiceReturnsNoItems() throws Exception {// Setupwhen(mockUserInfoService.queryUserInfoList(2022-09-05 15:11:21, Arrays.asList(0))).thenReturn(Collections.emptyList());// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/query/users/ids).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo([]);}Testpublic void testGetUserInfoListLike() throws Exception {// Setup// Configure UserInfoService.queryListByUserName(...).final UserInfo userInfo new UserInfo();userInfo.setId(0);userInfo.setUserName(MyBatis Log Free);userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final ListUserInfo userInfos Arrays.asList(userInfo);when(mockUserInfoService.queryListByUserName(A)).thenReturn(userInfos);// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/query/users/like).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo(expectedResponse);}Testpublic void testGetUserInfoListLike_UserInfoServiceReturnsNoItems() throws Exception {// Setupwhen(mockUserInfoService.queryListByUserName(A)).thenReturn(Collections.emptyList());// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/query/users/like).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo([]);}Testpublic void testSaveUserInfo() throws Exception {// Setup// Run the testfinal MockHttpServletResponse response mockMvc.perform(get(/boot/save/userinfo).accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo(expectedResponse);verify(mockUserInfoService).saveUser(new UserInfo());} } Mock用于模拟不属于 Spring 上下文的对象而MockBean用于模拟属于 Spring Boot 应用程序中的 Spring 上下文的对象。MockBean提供与 Spring Boot 测试框架的无缝集成并允许在测试期间用模拟对象轻松替换实际 bean  Mockito提供了多种参数匹配器Matchers用于更灵活的验证和配置行为 import static org.mockito.ArgumentMatchers.*; when(mockRepository.findById(anyInt())).thenReturn(Optional.of(user)); verify(mockRepository).findById(eq(1)); 常见的匹配器包括   ·any()匹配任何参数   · anyInt()匹配任何整数参数   · eq(value)匹配特定值   · isNull()匹配null值   · notNull()匹配非null值 Mock异常 Mockito.when(userMapper.getUserById(Mockito.anyInt())).thenThrow(new RuntimeException(运行时错误));Assertions.assertThrowsExactly(RuntimeException.class, () - userMapper.getUserById(1));// 对于没有返回值的方法不能使用thenThrow()来抛出异常可以使用doThrow()来抛出异常。 Mockito.doThrow(new RuntimeException(运行时错误)).when(userMapper).getUserById(1); 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注解创建几个实例 原始代码 Service public class TemplateUserServiceImpl implements TemplateUserService {Autowiredprivate NamedParameterJdbcTemplate jdbcTemplate;TransactionalOverridepublic void saveUser() {UserInfo userInfo new UserInfo();userInfo.setId(7);userInfo.setUserName(Boot);Date startTime new Date();Date endTime new Date();userInfo.setCreateTime(startTime);userInfo.setUpdateTime(endTime);// JdbcTemplate的写入datetime,使用in方式 // String sqlinsert into user_info(user_name,create_time,update_time) values(:user_name,:create_time,:update_time);String sqlinsert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime);SqlParameterSource sqlParameterSourcenew BeanPropertySqlParameterSource(userInfo); // HashMap paramMap new HashMap(); // paramMap.put(user_name,userInfo.getUserName()); // paramMap.put(create_time,userInfo.getCreateTime()); // paramMap.put(update_time,userInfo.getUpdateTime()); // jdbcTemplate.update(sql,paramMap);jdbcTemplate.update(sql,sqlParameterSource);} } 对应单元测试代码 import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource;import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class TemplateUserServiceImplTest {Mockprivate NamedParameterJdbcTemplate mockJdbcTemplate;InjectMocksprivate TemplateUserServiceImpl templateUserServiceImplUnderTest;Testpublic void testSaveUser() {// Setup// Run the testtemplateUserServiceImplUnderTest.saveUser();// Verify the resultsverify(mockJdbcTemplate).update(eq(insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)),any(SqlParameterSource.class));}Testpublic void testSaveUser_NamedParameterJdbcTemplateThrowsDataAccessException() {// Setupwhen(mockJdbcTemplate.update(eq(insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)),any(SqlParameterSource.class))).thenThrow(DataAccessException.class);// Run the testassertThatThrownBy(() - templateUserServiceImplUnderTest.saveUser()).isInstanceOf(DataAccessException.class);} } 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关闭否则会保存失败的.  最后破解成功可以正常使用。
http://www.hkea.cn/news/14474143/

相关文章:

  • 建立网站的顺序项目设计方案
  • 电子商务网站建设的意义是什么意思电脑上用手机app是什么软件
  • 中国公司查询网站wordpress不居中
  • 网站建设方投资成本网站排名软件多浏览器
  • 井冈山保育院网站建设网站设计的公司运营接单
  • 网站建设douyanet个人做网站要注意什么条件
  • 网站建设的基本要求织梦网站文章内容模板
  • 网站建设网站推广优化二手网站怎么做
  • 南山网站建设公司乐云seo免费word模板
  • 河南省濮阳市建设局网站广告投放平台系统
  • 360路由器做网站网站建设项目策划书
  • 微信官网站国外短视频软件
  • 耒阳网站建设黄页网如何注册
  • 遵义网站建设网站公司注册流程图及时间
  • 气血不足做网站接外包活去什么平台
  • 太原论坛网站开发公司网站建设ps模板下载
  • 佛山专业建设网站平台网页制作图片模板
  • 公司让做网站违法招投标建设网站的网站
  • 没事网站建设项目规划书京津冀协同发展交通一体化规划
  • 做金融的喜欢逛哪些网站宁波公司建网站哪家好
  • iis打开网站变成下载啥前端框架可以做网站首页
  • 找个人给我做电影网站广州住房和城乡建设局官网
  • 2014山东春季高考网站建设建立企业网站的步骤
  • 公司怎么制作网站江门网站制作设计
  • 公司网站制作专业公司vps 建网站 代理
  • 企业网站推广计划专业网站建设品牌策
  • 懂福溶州做戒网站湖北省黄冈建设信息网站
  • 电商网站规划市场营销推广活动方案
  • 快速建站介绍灰色行业做网站推广
  • 网站建设中 模板下载天津建设网证件查询