Java单元测试中如何mock CompanyUserDTO接口返回值,现有方案是否合理?
1 如何生成Mock的CompanyUserDTO列表
你可以选以下两种常用方案:
- 方案一:用Mockito直接Mock接口实例
不需要额外写实现类,直接给接口的方法打桩即可,适合临时生成少量测试对象:
// 生成3个测试用的Mock CompanyUserDTO实例 List<CompanyUserDTO> companyUserDTOList = IntStream.rangeClosed(1, 3) .mapToObj(index -> { CompanyUserDTO mockDto = Mockito.mock(CompanyUserDTO.class); // 匹配你传入的userUuid参数 UUID userUuid = UUID.fromString(String.format("00000000-0000-0000-0000-00000000000%d", index)); UUID companyUuid = UUID.randomUUID(); String companyName = "测试企业" + index; // 给接口方法打桩返回固定值 Mockito.when(mockDto.getUserUuid()).thenReturn(userUuid); Mockito.when(mockDto.getCompanyUuid()).thenReturn(companyUuid); Mockito.when(mockDto.getCompanyName()).thenReturn(companyName); return mockDto; }) .collect(Collectors.toList());
- 方案二:写简易接口实现类
如果你后续多个测试都要用到CompanyUserDTO的实例,可以写个简单的实现类,Java 16及以上版本用record可以快速实现:
// 测试类内部定义临时实现,不需要单独建文件 record MockCompanyUserDTO(UUID userUuid, UUID companyUuid, String companyName) implements CompanyUserDTO {} // 直接构造实例即可 List<CompanyUserDTO> companyUserDTOList = List.of( new MockCompanyUserDTO(UUID.fromString("00000000-0000-0000-0000-000000000001"), UUID.randomUUID(), "测试企业1"), new MockCompanyUserDTO(UUID.fromString("00000000-0000-0000-0000-000000000002"), UUID.randomUUID(), "测试企业2"), new MockCompanyUserDTO(UUID.fromString("00000000-0000-0000-0000-000000000003"), UUID.randomUUID(), "测试企业3") );
2 当前单元测试方案合理性评估
你的测试思路是合理的,当前service层的findAllByUserUuidIn方法没有额外业务逻辑,只是透传调用repository并返回结果,测试目标就是验证参数透传正确性、结果返回正确性。
不过现有测试可以补充两处优化点,更严谨:
- 不要用空列表作为返回值,填充非空的Mock实例进行断言,避免空列表相等的巧合,无法覆盖返回内容的校验场景
- 增加对repository调用的校验,确认repository被正确调用了1次,且传入的参数和你构造的
userUuidList一致,补充代码如下:
// 放在断言之前即可 Mockito.verify(companyUserRepository, Mockito.times(1)) .findAllByUserUuidIn(ArgumentMatchers.eq(userUuidList));
如果后续你在这个service方法中增加了业务逻辑(比如数据过滤、字段补全、排序等),再对应扩展断言逻辑,校验处理后的结果是否符合预期即可。
内容的提问来源于stack exchange,提问作者user17186249
相关产品推荐
相关产品推荐

