我试图实现Mockito来测试一个特定的方法,但是。然后返回(…)似乎总是返回空对象,而不是我想要的:
切:
public class TestClassFacade {
// injected via Spring
private InterfaceBP bpService;
public void setBpService(InterfaceBP bpService) {
this.bpService = bpService;
}
public TestVO getTestData(String testString) throws Exception {
BPRequestVO bpRequestVO = new BPRequestVO();
bpRequestVO.setGroupNumber(testString) ;
bpRequestVO.setProductType("ALL") ;
bpRequestVO.setProfileType("Required - TEST") ;
IBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO); //PROBLEM
if (serviceResponse.getMessage().equalsIgnoreCase("BOB")) {
throw new Exception();
} else {
TestVO testVO = new TestVO();
}
return testVO;
}
}
Spring配置:
<bean id="testClass" class="com.foo.TestClassFacade">
<property name="bpService" ref="bpService" />
</bean>
<bean id="bpService" class="class.cloud.BPService" />
莫基托试验方法:
@RunWith(MockitoJUnitRunner.class)
public class BaseTest {
@Mock BPService mockBPService;
@InjectMocks TestClassFacade mockTestClassFacade;
private String testString = null;
private BPRequestVO someBPRequestVO = new BPRequestVO();
private IBPServiceResponse invalidServiceResponse = new BPServiceResponse();
@Test (expected = Exception.class)
public void getBPData_bobStatusCode_shouldThrowException() throws Exception {
invalidServiceResponse.setMessage("BOB");
someBPRequestVO.setGroupNumber(null);
someBPRequestVO.setProductType("ALL");
someBPRequestVO.setProfileType("Required - TEST");
System.out.println("1: " + someBPRequestVO.getGroupNumber());
System.out.println("2: " + someBPRequestVO.getProductType());
System.out.println("3: " + someBPRequestVO.getProfileType());
System.out.println("4: " + someBPRequestVO.getEffectiveDate());
when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse);
mockTestClassFacade.getTestData(testString);
verify(mockBPService).getProduct(someBPRequestVO);
}
}
系统输出:
1: null
2: ALL
3: Required - TEST
4: null
这里发生的事情是,当我运行测试时,在上面标有//PROBLEM的CUT中的行上,serviceSolutions对象为空。我的愿望是让那个对象从我的测试方法中填充我的“无效服务响应”对象。从我的System.out.println的输出来看,我的bpquiestVO似乎在内容上与我的某些BPrecestVO相匹配。
有人能告诉我我错过了什么吗?
谢谢你的时间!
问题在于您在使用when()时使用了。
您提交了对构造实例的引用;因此,只有当传递给方法的参数是相同的引用时,mocking才会返回您想要的内容。
你想要的是一个论点匹配者;比如:
when(mockBPService.getProduct(argThatMatches(someBPRequestVO))
.thenReturn(whatYouWant);
当然,它需要你编写参数匹配器!
请注意,有一个内置的匹配器,可以做你想做的事情:
when(mockBPService.getProduct(eq(someBPRequestVO))).thenReturn(whatYouWant);
当然,这个匹配器需要您的BPRequestVO
类实现equals()
(以及hashCode()
)!
与when()
一起使用的BPRequestVO实例与getTestData()
中使用的实例不同
除非覆盖equals()
,否则它们将不匹配。
如果重写equals(),则不需要编写自定义匹配器。请注意Mockito文档中的以下内容:
“自定义参数匹配器会降低测试的可读性。有时,最好对传递给mock的参数实现equals()(Mockito自然会使用equals()进行参数匹配)。这可以使测试更简洁。”
您可以使用any(YourObject.class)创建一个模拟参数,如下所示:
when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse);
问题内容: 我在Mockito中有这个: 该方法应始终返回一个新实例,但它会返回两次相同的引用。 为什么该方法不返回新值? 问题答案: 该方法将始终返回传递给它的内容。该代码是在调用之前执行的。然后将创建的内容传递给。因此有一个绝对的实例而不是创建机制。 如果需要提供新实例,请使用thenAnswer
我正在对我的一个服务进行Mockito单元测试,我试图模拟它,但无法返回所需的对象。我的代码片段如下所示: 现在,通过了测试用例,但是失败了,因为。 我很困惑,我不是刚刚模拟了返回一个的行为吗?我做了一些研究,发现了这篇文章:Mockito when/then not returning expected value,我想知道如何使用“doreturn()...when()”定义嘲笑行为,但仍然没
我正在尝试构建一个使用gradle作为构建工具和openjdk-11的原型。这个原型将在springboot框架上构建一个rest-api。 我的模块与rest api调用配合良好,并返回了预期结果。然而,当我现在试图为RESTAPI编写测试时,测试失败了,因为Mockito返回了空对象。如果您能了解我应该如何为这个rest api编写测试或如何修复它,我将不胜感激。 我的控制器: 服务: 模型:
我试图模拟一个对象,该对象返回一个带有Mockito的Java可选对象: 当被调用,它返回。 我希望方法返回 返回的任何原因? 方法如下: 以下是Junit:
我正在使用AWS Amplify在iOS和Android上构建一个应用程序。我有一个lambda表达式,它接受经度、纬度、用户名和对象id,并返回一个布尔值,告诉我用户是否在物理上接近该对象。 它完美地工作在我的iOS应用程序,我得到或取决于用户位置,但在Android上,我总是得到作为响应。 这是触发lambda的函数: 当我打印日志的参数发送到lambda一切正常,正确的值被发送。 这是我的回
问题内容: 我已经尝试过使用并且都没有返回文档。是在返回一个空数组被返回。在这两种情况下也是如此。 这是我的联系: 这是我的架构: 我的查询在这里: 我可以将内容上传到数据库,并通过RockMongo进行查看,但之后无法获取它们。这是我第一次使用MongoDB,因此我认为我只是缺少一些基础知识。向正确方向的任何推动都是很棒的! 问题答案: 建立模型所绑定的集合的名称的调用,默认值为复数的小写模型名