如何模拟未设置为变量的对象

时间:2019-05-22 20:34:21

标签: java junit mockito powermockito

我目前正在为遗留代码编写单元测试。我需要在该对象的函数调用上为“ doReturn”模拟一个对象。但是,该对象在被调用的同一行上实例化,并且从未分配给变量。有没有一种方法可以模拟此返回值而不接触原始代码?

旧版代码行包含需要返回模拟列表的函数调用:

List<Map<String, String>> referenceDataList = new ReferenceDataInquiryMapper().execute(referenceDataInquiry);

我试图嘲笑这个“执行”调用:

List<Map<String, String>> referenceDataList = new ArrayList<Map<String, String>>();
//Add data to referenceDataList
ReferenceDataInquiryMapper referenceDataInquiryMapper = PowerMockito.mock(ReferenceDataInquiryMapper.class);
PowerMockito.doReturn(referenceDataList).when(referenceDataInquiryMapper,"execute",Mockito.any());

我也尝试过:

PowerMockito.doReturn(referenceDataList).when(new ReferenceDataInquiryMapper(),"execute",Mockito.any());

哪个会引发PowerMockito错误

还有:

PowerMockito.doReturn(referenceDataList).when(PowerMockito.mock(ReferenceDataInquiryMapper.class),"execute",Mockito.any());

哪个抛出与我的第一次尝试相同的异常。

上面的第一行不是返回Mock值,而是在运行测试并抛出异常时尝试创建一个实际的新对象。实际上可以模拟该代码吗?

〜谢谢

2 个答案:

答案 0 :(得分:0)

对于类execute()的任何对象,您可以使用Aspect4J并在对ReferenceDataInquiryMapper的调用之前 附加一个方面。然后,您的方面可以返回您想要的任何值。

您还需要配置方面以不执行原始方法。

答案 1 :(得分:0)

创建新对象时,我们需要返回其模拟对象。如下添加新的内容。

List<Map<String, String>> referenceDataList = new ArrayList<Map<String, String>>();
//Add data to referenceDataList
ReferenceDataInquiryMapper referenceDataInquiryMapper = 
PowerMockito.mock(ReferenceDataInquiryMapper.class);

PowerMockito.whenNew(ReferenceDataInquiryMapper.class).thenReturn( referenceDataInquiryMapper);

PowerMockito.doReturn(referenceDataList).when( referenceDataInquiryMapper,"execute",Mockito.any());