我目前正在为遗留代码编写单元测试。我需要在该对象的函数调用上为“ 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值,而是在运行测试并抛出异常时尝试创建一个实际的新对象。实际上可以模拟该代码吗?
〜谢谢
答案 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());