Java单元测试中如何让Mocked Repository返回方法生成的结果
解决Mock Repository的saveAll返回方法内部生成列表的问题
你需要让Mock的saveAll方法动态返回被测方法里传入的列表(也就是内部生成的list),甚至可以模拟持久化后的修改,用Mockito的Answer就能实现,具体步骤如下:
1. 配置findBy方法(你已完成,此处仅作参考)
先保留你已有的Mock逻辑:
MyRepository mockRepo = Mockito.mock(MyRepository.class); // 配置findBy方法返回预期数据 Mockito.when(mockRepo.findByXXX(Mockito.any())).thenReturn(你的测试数据列表);
2. 用Answer动态处理saveAll的返回值
不要用固定的thenReturn,改用thenAnswer获取调用saveAll时传入的实际参数,再返回它(或模拟持久化修改后返回):
场景1:直接返回传入的列表
如果不需要模拟持久化修改,直接返回被测方法传入的list即可:
Mockito.when(mockRepo.saveAll(Mockito.anyList())).thenAnswer(invocation -> { // 获取saveAll接收的参数列表 List<B> inputList = invocation.getArgument(0); return inputList; });
场景2:模拟持久化修改后返回
如果要验证持久化后的属性变化(比如给对象自动生成ID),可以在Answer里修改列表元素再返回:
Mockito.when(mockRepo.saveAll(Mockito.anyList())).thenAnswer(invocation -> { List<B> inputList = invocation.getArgument(0); // 模拟数据库自动生成ID的逻辑 inputList.forEach(b -> b.setId(UUID.randomUUID().toString())); return inputList; });
3. 执行测试并断言
实例化被测类,调用方法后直接对返回结果做断言:
MyClass myClass = new MyClass(mockRepo); A testRequest = 构建你的测试请求对象; List<B> savedList = myClass.addAll(testRequest); // 断言验证,比如检查列表大小、元素属性等 Assertions.assertEquals(预期元素数量, savedList.size()); // 如果是场景2,还可以断言ID是否生成 Assertions.assertNotNull(savedList.get(0).getId());
这种方式完全适配被测方法内部动态生成的list,不会因为预先定义固定列表导致测试脱离实际逻辑。
内容的提问来源于stack exchange,提问作者magalenyo
相关产品推荐
相关产品推荐

