Java Mockito-thenReturn始终返回空对象
我试图实现Mockito来测试一个特定的方法,但是.thenReturn(…)似乎总是返回一个null对象,而不是我想要的: 削减: 弹簧配置: 系统输出: 这里发生的事情是,当我运行测试时,serviceResponse对象在上面标记为//PROBLEM的代码行中为null。我的愿望是用测试方法中的“invalidServiceResponse”对象填充该对象。从System.out.println的输出来看,我的bpRequestVO似乎与内容中的someBPRequestVO匹配 有人能告诉我我错过了什么吗Java Mockito-thenReturn始终返回空对象,java,null,mockito,Java,Null,Mockito,我试图实现Mockito来测试一个特定的方法,但是.thenReturn(…)似乎总是返回一个null对象,而不是我想要的: 削减: 弹簧配置: 系统输出: 这里发生的事情是,当我运行测试时,serviceResponse对象在上面标记为//PROBLEM的代码行中为null。我的愿望是用测试方法中的“invalidServiceResponse”对象填充该对象。从System.out.println的输出来看,我的bpRequestVO似乎与内容中的someBPRequestVO匹配 有人能告
谢谢你的时间 问题在于使用
when()
提交对构造实例的引用;因此,只有当传递给方法的参数是相同的引用时,模拟才会返回您想要的结果
你想要的是一个论点匹配器;比如:
when(mockBPService.getProduct(argThatMatches(someBPRequestVO))
.thenReturn(whatYouWant);
当然,它要求您编写参数匹配器
请注意,有一个内置的匹配器,它可以执行您想要的操作:
when(mockBPService.getProduct(eq(someBPRequestVO))).thenReturn(whatYouWant);
这个匹配器当然需要您的
BPRequestVO
类实现equals()
(还有hashCode()
) 与when()
一起使用的BPRequestVO实例与getTestData()
中使用的实例不同除非覆盖
equals()
,否则它们将不匹配
如果重写equals(),则不需要编写自定义匹配器。请注意以下内容:
“自定义参数匹配器会降低测试的可读性。有时最好对传递给mock的参数实现equals()(Mockito自然使用equals()进行参数匹配)。这可以使测试更干净。”
与在BPRequestVO类中创建equals方法不同,您可以创建一个带有“any(YourObject.class)”的模拟参数,如下所示:
when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse);
用于模拟的BPRequestVO对象实例与junit执行时使用的实例不同 最好的方法是在模拟时配置对象的任何实例
when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse);
可以使用更新
when(mockBPService.getProduct(Mockito.any(BPRequestVO.class))).thenReturn(invalidServiceResponse);
我的问题是,模拟服务被定义为final。最有可能的情况是,当(…)与实际方法中传递的内容匹配时,它无法将参数与您在其中设置的getProduct匹配。尝试在when(service.getProduct(argThat(…))中使用匹配器。然后return.OP:您应该接受@lewthor的答案;我错了,重写
.equals()
就足够了,您不需要参数匹配器感谢后续的fge…我刚刚用.equals()测试了它我独自一人回到了这个页面,以确保我没有误解什么。我确实找到了你的评论!我已经切换了接受的答案。感谢你的诚实。感谢lewthor!我在BPRequestVO中添加了.equals()(和.hashcode),现在我在运行测试用例时看到了一个填充的serviceResponse对象。有吗(YourObject.class)就是答案。不知道为什么其他帖子比自己聪明。向上投票
when(mockBPService.getProduct(eq(someBPRequestVO))).thenReturn(whatYouWant);
when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse);
when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse);
when(mockBPService.getProduct(Mockito.any(BPRequestVO.class))).thenReturn(invalidServiceResponse);