You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:08:48