自己做的网站不备案不能访问吗,万网网站发布,襄阳市建设局网站,wordpress 文章分页 链接【单元测试】SpringBoot 
1. 为什么单元测试很重要#xff1f;‼️ 从前#xff0c;有一个名叫小明的程序员#xff0c;他非常聪明#xff0c;但有一个致命的缺点#xff1a;懒惰。小明的代码写得又快又好#xff0c;但他总觉得单元测试是一件麻烦事#xff0c;觉得代码…【单元测试】SpringBoot 
1. 为什么单元测试很重要‼️ 从前有一个名叫小明的程序员他非常聪明但有一个致命的缺点懒惰。小明的代码写得又快又好但他总觉得单元测试是一件麻烦事觉得代码能跑就行测试什么的全是浪费时间。 有一天小明接到了一个重要的项目他需要为一个在线购物网站开发一个新功能用户可以在结账时使用优惠券。小明想“这还不简单半小时搞定”于是他迅速写好了代码迫不及待地提交了。 第二天项目经理来了满脸怒气地对小明说“小明你的代码出问题了所有用户在使用优惠券时都得到了负数的折扣他们的账户反而被扣了更多的钱” 小明惊讶地张大了嘴巴不敢相信自己会犯这么低级的错误。他连忙检查代码发现确实在计算折扣时忘记处理负数的情况。小明赶紧修复了这个错误但心里还是觉得不服气“这只是个小问题我不需要写单元测试。” 几天后小明又收到一个新任务实现一个积分系统用户每消费一元就能积一分。小明想“这次我一定不会犯错。”于是他又快速写好了代码提交了上去。 然而不久之后客户打电话过来抱怨“我的积分怎么越消费越少了” 小明再次检查代码发现自己在积分计算的函数里不小心多写了一个减号导致积分被扣除而不是增加。他这次终于意识到如果自己早点写单元测试这些问题完全可以在开发阶段就被发现而不是在上线后被用户发现。 于是小明决定改过自新认真学习单元测试。他发现单元测试不仅可以帮助他捕捉到代码中的错误还能让他更加自信地进行代码重构和优化。 总结 早期发现问题单元测试能够在开发阶段及时发现代码中的错误避免错误在后期被发现减少修复成本。  确保代码质量通过编写单元测试可以验证每个模块的功能是否按预期工作提升代码的可靠性和稳定性。  方便重构在进行代码重构或优化时有单元测试作为保障可以放心地修改代码而不必担心引入新的错误  文档作用单元测试可以作为代码的活文档帮助新成员快速理解代码的功能和使用方法  
2. 快速入门 
2.1 基础配置 
在 pom.xml 中添加以下依赖 
dependencies!-- Spring Boot Starter Test --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency
/dependencies这个依赖包含了多个库和功能主要有以下几个 
JUnitJUnit是Java中最流行和最常用的单元测试框架它提供了一套注解和断言来编写和运行单元测试。例如Test注解表示一个测试方法assertEquals断言表示两个值是否相等。Spring TestSpring Test是一个基于Spring的测试框架它提供了一套注解和工具来配置和管理Spring上下文和Bean。例如SpringBootTest注解表示一个集成测试类Autowired注解表示自动注入一个Bean。MockitoMockito是一个Java中最流行和最强大的Mock对象库它可以模拟复杂的真实对象行为从而简化测试过程。例如MockBean注解表示创建一个Mock对象when方法表示定义Mock对象的行为。HamcrestHamcrest是一个Java中的匹配器库它提供了一套语义丰富而易读的匹配器来进行结果验证。例如assertThat断言表示验证一个值是否满足一个匹配器is匹配器表示两个值是否相等。AssertJAssertJ是一个Java中的断言库它提供了一套流畅而直观的断言语法来进行结果验证。例如assertThat断言表示验证一个值是否满足一个条件isEqualTo断言表示两个值是否相等。 
除了以上这些库外spring-boot-starter-test还包含了其他一些库和功能如JsonPath、JsonAssert、XmlUnit等。这些库和功能可以根据不同的测试场景进行选择和使用。 
Mockito详解地址https://pdai.tech/md/develop/ut/dev-ut-x-mockito.html 
2.2 编写单元测试 
为了更好的演示如何编写单元测试以最简单的用户登录为例 
项目结构 
src
├── main
│   └── java
│       └── com
│           └── hwq
│               └── fuwork01
│                   ├── common
│                   ├── controller
│                   │   └── UserController.java
│                   ├── dto
│                   ├── exception
│                   └── service
│                   		└── UserService
└── test└── java└── com└── hwq└── fuwork01├── controller│   └── UserControllerTest.java└── service└──FuWork01ApplicationTests.javaUserServiceImplService层 
/**
* author wqh
* description 针对表【user(用户表)】的数据库操作Service实现
* createDate 2024-07-15 17:13:27
*/
Service
public class UserServiceImpl extends ServiceImplUserMapper, Userimplements UserService{Overridepublic Long userLogin(String userAccount, String userPassword, HttpServletRequest request) {LambdaQueryWrapperUser userLambdaQueryWrapper  new LambdaQueryWrapper();userLambdaQueryWrapper.eq(User::getUserAccount, userAccount).eq(User::getUserPassword, userPassword);User user  this.getOne(userLambdaQueryWrapper);if (user  null) {throw new BusinessException(ErrorCode.NOT_FOUND_ERROR ,用户不存在);}// 存储用户登录态request.getSession().setAttribute(userLogin, user);return user.getId();}Overridepublic User getLoginUser(HttpServletRequest request) {return (User)request.getSession().getAttribute(userLogin);}}针对Service层的测试 
SpringBootTest
public class UserServiceTest {Resourceprivate UserService userService;private HttpServletRequest request;BeforeEachvoid setUp() {// 模拟构造requestrequest  new MockHttpServletRequest();}/*** 测试用户登录*/Testvoid userLogin() {String userAccount  huang;String userPassword  huangwenqing;Long userId  userService.userLogin(userAccount, userPassword, request);// 验证结果对象与user对象相等assertThat(userId, Matchers.is(1L));}}解释 
request  new MockHttpServletRequest()构造一个模拟的requestassertThat判断userId是否符合正常 
新断言assertThat使用 
JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句结合 Hamcrest 提供的匹配符就可以表达全部的测试思想。 
assertThat 的优点 
优点 1 以前 JUnit 提供了很多的 assertion 语句如assertEqualsassertNotSameassertFalseassertTrueassertNotNullassertNull 等现在有了 JUnit 4.4一条 assertThat 即可以替代所有的 assertion 语句这样可以在所有的单元测试中只使用一个断言方法使得编写测试用例变得简单代码风格变得统一测试代码也更容易维护。 
优点 2 assertThat 使用了 Hamcrest 的 Matcher 匹配符用户可以使用匹配符规定的匹配准则精确的指定一些想设定满足的条件具有很强的易读性而且使用起来更加灵活。 
优点 3 assertThat 不再像 assertEquals 那样使用比较难懂的“谓宾主”语法模式如assertEquals(3, x);相反assertThat 使用了类似于“主谓宾”的易读语法模式如assertThat(x,is(3));使得代码更加直观、易读。 
UserController登录控制层 
RestController
RequestMapping(/user)
CrossOrigin(*)
public class UserController {Resourceprivate UserService userService;PostMapping(/login)public BaseResponseLong userLogin(RequestBody UserLoginDTO userLoginDTO, HttpServletRequest request) {if (userLoginDTO  null) {throw new BusinessException(ErrorCode.PARAMS_ERROR, 参数错误);}String userAccount  userLoginDTO.getUserAccount();String userPassword  userLoginDTO.getUserPassword();if (StringUtils.isEmpty(userAccount)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, 账户不得为空);}if (StringUtils.isEmpty(userPassword)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, 密码不得为空);}return ResultUtils.success(userService.userLogin(userAccount, userPassword, request));}
}内容 
对上传的登录参数进行校验登录成功返回用户id 
针对controller层单元测试 
SpringBootTest
AutoConfigureMockMvc
public class UserControllerTest {Autowiredprivate MockMvc mockMvc;MockBeanprivate UserService userService;/*** 用户登录成功测试* throws Exception*/Testvoid testUserLoginSuccess() throws Exception {UserLoginDTO userLoginDTO  new UserLoginDTO();userLoginDTO.setUserAccount(huang);userLoginDTO.setUserPassword(huangwenqing);// userService测试when(userService.userLogin(huang, huangwenqing, new MockHttpServletRequest())).thenReturn(1L);// 模拟http登录请求mockMvc.perform(post(/user/login).contentType(MediaType.APPLICATION_JSON).content({\userAccount\:\huang\,\userPassword\:\huangwenqing\})).andExpect(status().isOk()).andExpect(jsonPath($.code).value(0)).andExpect(jsonPath($.data).value(0L));}/*** 用户登录异常测试* throws Exception*/Testvoid testUserLoginNullParams() throws Exception {mockMvc.perform(post(/user/login).contentType(MediaType.APPLICATION_JSON).content({})).andExpect(status().isOk()).andExpect(jsonPath($.code).value(40000));}
}要点 
SpringBootTest: 加载完整的 Spring 应用程序上下文。AutoConfigureMockMvc: 自动配置 MockMvc用于模拟 HTTP 请求。MockMvc: 用于模拟 HTTP 请求和响应的测试。MockBean: 创建并注入一个模拟的 UserService 实例以便于测试控制器而不需要实际的服务实现。使用 mockMvc.perform 方法发送 POST 请求模拟用户登录。使用 andExpect 方法验证 HTTP 状态码和响应体中的数据。 
2.3测试原则 
保持测试独立确保每个测试独立运行不依赖其他测试的执行结果使用模拟对象对于外部依赖如数据库、网络请求等尽量使用模拟对象以提高测试的速度和稳定性。覆盖各种场景编写充分的测试用例覆盖正常路径、异常路径和边界条件。保持测试简洁测试代码应该简洁明了避免过于复杂的逻辑以提高可维护性。 
3.总结 
编写优雅的单元测试是保证代码质量的关键。在 Spring Boot 中我们可以使用 SpringBootTest 和 AutoConfigureMockMvc 等注解简化测试配置使用 Mockito 等工具模拟依赖编写覆盖全面的测试用例。通过遵循最佳实践我们可以编写高效、稳定的单元测试提高开发效率和代码质量。 
希望本文对您在 Spring Boot 项目中编写单元测试有所帮助。Happy Testing!