gpt4 book ai didi

java - PowerMock whenNew 不返回模拟实例

转载 作者:行者123 更新时间:2023-12-02 02:07:31 25 4
gpt4 key购买 nike

我正在尝试使用 PowerMock 来取消对 Jackson ObjectMapper 的调用,但由于某种原因它不起作用,我怀疑它与 whenNew 在被测试的方法中实例化时实际上没有提供模拟实例有关.

这是一个我们无法真正更改的遗留代码库,因此我们只能使用 PowerMock 来满足测试覆盖率要求...

我有一个类似于以下内容的方法:

private void intakeDataFromUrl(URL url) {
ObjectMapper mapper = new ObjectMapper();
DataDTO[] dataDtos = mapper.readValue(url, DataDTO[].class)

// other code
}

在单元测试中,我尝试执行以下操作:

@Test
public void test_intakeDataFromUrl() {

DataDTO[] data = this.createMockData();

ObjectMapper mapper = mock(ObjectMapper.clas);

whenNew(ObjectMapper.clas)
.withNoArguments()
.thenReturn(mapper);

// mock call to return mocked data
doReturn(data)
.when(mapper, "readValue", any(URL.class), any(DataDTO[].class))
}

但是在正在测试的代码中,dataDtos 始终为 null,然后下一段代码总是失败。

编辑:

看起来这一行可能是问题所在,尽管查看其他示例它应该可以工作。

// mock call to return mocked data
doReturn(data)
.when(mapper, "readValue", any(URL.class), any(DataDTO[].class))

我还在最后一个参数上尝试了 isA 和 eq,但没有成功,仍然返回 null。

最佳答案

以下使用 whenNewObjectMapper 可以成功运行:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ObjectMapper.class})
public class WtfTest {

@Test
public void test_intakeDataFromUrl() throws Exception {
String in = "in";
String out = "out";

ObjectMapper mapper = mock(ObjectMapper.class);

PowerMockito.whenNew(ObjectMapper.class)
.withNoArguments()
.thenReturn(mapper);

Mockito.when(mapper.readValue(in, String.class)).thenReturn(out);

assertEquals(out, intakeDataFromUrl(in));
}

private String intakeDataFromUrl(String url) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(url, String.class);
}
}

尽管此示例未使用 DataDTO,但它在其他方面与您的示例一致并且有效。

关于java - PowerMock whenNew 不返回模拟实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com