SpringBoot服务JUnit测试求助:UserInfoService测试实现指导
完善Spring Boot UserInfoService的JUnit测试方案
刚接触JUnit测试不用慌,我来帮你把这个UserInfoService的测试代码完善好,刚好覆盖你提到的两个核心测试点~
首先先修正一下原服务代码里的小细节:responseUserInfoData.setid应该改成responseUserInfoData.setId(符合JavaBean的命名规范),不然编译会报错哦。
接下来是完善后的测试代码,我覆盖了用户存在和用户不存在两种核心场景,同时验证你要求的两个测试点:
@RunWith(MockitoJUnitRunner.class) public class UserInfoServiceTests { @InjectMocks private UserInfoService userInfoService; // 变量名改成小驼峰,符合Java编码规范 @Mock private UserInfoServiceClient userInfoServiceClient; @Test public void shouldReturnUserInfoData_WhenUserExists() { // 1. 准备测试数据 String testUserId = "ABC"; UserServiceDTO mockUserServiceDTO = new UserServiceDTO(); mockUserServiceDTO.setId("123"); // 这里调用set方法,提前验证set逻辑正常 // 2. 模拟外部客户端的返回行为,避免调用真实API ResponseEntity<UserServiceDTO> mockClientResponse = ResponseEntity.ok(mockUserServiceDTO); Mockito.when(userInfoServiceClient.sendResponse(testUserId)).thenReturn(mockClientResponse); // 3. 执行待测试的服务方法 ResponseEntity<ResponseUserInfoData> result = userInfoService.sendUserInfo(testUserId); // 4. 断言验证,覆盖你的两个测试点 // 验证返回的ResponseEntity状态码为200 OK Assert.assertEquals(HttpStatus.OK, result.getStatusCode()); // 验证ResponseUserInfoData的id正确,同时验证get方法正常工作 Assert.assertEquals("123", result.getBody().getId()); // 验证外部客户端方法被正确调用了1次 Mockito.verify(userInfoServiceClient, Mockito.times(1)).sendResponse(testUserId); } @Test public void shouldReturnNoContent_WhenUserDoesNotExist() { // 1. 准备测试数据 String testUserId = "XYZ"; // 2. 模拟外部客户端返回null的body(模拟用户不存在的场景) ResponseEntity<UserServiceDTO> mockClientResponse = ResponseEntity.ok(null); Mockito.when(userInfoServiceClient.sendResponse(testUserId)).thenReturn(mockClientResponse); // 3. 执行待测试的服务方法 ResponseEntity<ResponseUserInfoData> result = userInfoService.sendUserInfo(testUserId); // 4. 断言验证 // 验证返回的ResponseEntity状态码为204 No Content Assert.assertEquals(HttpStatus.NO_CONTENT, result.getStatusCode()); // 验证返回的body为null Assert.assertNull(result.getBody()); // 验证外部客户端方法被正确调用 Mockito.verify(userInfoServiceClient, Mockito.times(1)).sendResponse(testUserId); } }
关键细节解释:
- 变量名规范:把原代码里的大驼峰变量名改成小驼峰(比如
UserInfoService改成userInfoService),避免和类名混淆,符合Java编码习惯。 - 覆盖核心场景:
- 当用户存在时,验证服务返回带正确数据的
200 OK响应,同时通过调用setId和断言getId,验证DTO的get/set方法正常工作。 - 当用户不存在时,验证服务返回
204 No Content响应,确保分支逻辑正确。
- 当用户存在时,验证服务返回带正确数据的
- Mockito的正确使用:
- 用
when(...).thenReturn(...)模拟UserInfoServiceClient的返回值,完全隔离外部依赖,不用调用真实的Rest API。 - 用
verify(...)验证依赖方法的调用次数,确保服务逻辑的流程符合预期。
- 用
- 精准断言:
- 直接验证
ResponseEntity的状态码和body内容,完全覆盖你要求的第一个测试点(验证返回Response Entity)。 - 通过对
ResponseUserInfoData的id进行断言,间接验证了UserServiceDTO和ResponseUserInfoData的get/set方法是否正常工作。
- 直接验证
内容的提问来源于stack exchange,提问作者Pkumar
相关产品推荐
相关产品推荐

