【问题标题】:How to Mock an object that is not set to a variable如何模拟未设置为变量的对象
【发布时间】: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


【解决方案1】:

当一个新对象被创建时,我们需要返回它的模拟。如下添加whenNew。

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());

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多