如何Mock返回自身入参的Bean?以StuffRepository为例
如何Mock返回自身入参的Repository Bean?
这其实是Mockito里非常常见的需求,针对你的StuffRepository的save方法,想要让它返回传入的第一个参数,有两种简洁的实现方式:
方式一:使用returnsFirstArg()(推荐,代码更简洁)
Mockito提供了returnsFirstArg()这个静态方法,可以直接让Mock方法返回第一个入参。你只需要这样写:
import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.returnsFirstArg; // ... 你的测试类代码 @MockBean private StuffRepository stuffRepository; public void test() { given(stuffRepository.save(any(Stuff.class))).willReturn(returnsFirstArg()); }
这里的any(Stuff.class)用来匹配任意类型为Stuff的入参,returnsFirstArg()告诉Mockito直接返回这个传入的参数。
方式二:使用willAnswer()(更灵活,适合需要处理参数的场景)
如果之后你需要对入参做一些简单处理再返回,或者你的Mockito版本不支持returnsFirstArg()(这个方法在Mockito 2.1+就已提供),可以用willAnswer()结合lambda表达式:
import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; // ... 你的测试类代码 @MockBean private StuffRepository stuffRepository; public void test() { given(stuffRepository.save(any(Stuff.class))).willAnswer(invocation -> { // 获取第一个入参(索引从0开始) Stuff inputStuff = invocation.getArgument(0); // 这里可以加一些参数处理逻辑,比如修改属性 // inputStuff.setId(1L); return inputStuff; }); }
这种方式通过InvocationOnMock对象获取传入的参数,你可以在返回前做任何自定义操作,最后返回处理后的参数(或者直接返回原参数)。
两种方式都能实现你想要的效果:当调用stuffRepository.save(v)时,Mock对象会返回v本身。
内容的提问来源于stack exchange,提问作者chaeyk
相关产品推荐
相关产品推荐

