Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito-thenReturn始终返回空对象_Java_Null_Mockito - Fatal编程技术网

Java Mockito-thenReturn始终返回空对象

Java Mockito-thenReturn始终返回空对象,java,null,mockito,Java,Null,Mockito,我试图实现Mockito来测试一个特定的方法,但是.thenReturn(…)似乎总是返回一个null对象,而不是我想要的: 削减: 弹簧配置: 系统输出: 这里发生的事情是,当我运行测试时,serviceResponse对象在上面标记为//PROBLEM的代码行中为null。我的愿望是用测试方法中的“invalidServiceResponse”对象填充该对象。从System.out.println的输出来看,我的bpRequestVO似乎与内容中的someBPRequestVO匹配 有人能告

我试图实现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);