【发布时间】:2019-05-22 20:34:21
【问题描述】:
我目前正在为遗留代码编写单元测试。我需要在对该对象的函数调用中模拟一个对象以获取“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 值,而是在运行测试时尝试创建一个实际的新对象并引发异常。是否可以实际模拟这段代码?
~谢谢
【问题讨论】:
-
修改代码以不创建对象本身,而是对其进行依赖注入。不能修改代码?那么为它编写单元测试就没有意义了——如果你在测试中发现了一个错误,你就无法修改代码来修复它,所以编写测试是徒劳的练习
-
为了澄清,你的意思是说没有办法模拟“= new object().getObject()”吗? @ErwinBolwidt
-
您需要存根对
new的调用以返回模拟,并分别存根execute。 -
你不需要 PowerMockito ;你做需要做的是将
ReferenceDataInquiryMapper作为构造函数参数传递给被测类,而不是newing它。 (你可以使用this(new RDIM()),如果这样更容易连接的话。)
标签: java junit mockito powermockito