Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PowerMock whenNew未返回模拟实例_Java_Unit Testing_Powermock - Fatal编程技术网

Java PowerMock whenNew未返回模拟实例

Java PowerMock whenNew未返回模拟实例,java,unit-testing,powermock,Java,Unit Testing,Powermock,我正试图使用PowerMock来拒绝对Jackson ObjectMapper的调用,但由于某些原因,它不起作用,我怀疑这与当模拟实例在被测试的方法中实例化时,它没有实际提供模拟实例有关 这是一个我们无法真正更改的遗留代码库,因此我们只能使用PowerMock来满足测试覆盖率要求 我有一个类似于以下内容的方法: private void intakeDataFromUrl(URL url) { ObjectMapper mapper = new ObjectMapper(); D

我正试图使用PowerMock来拒绝对Jackson ObjectMapper的调用,但由于某些原因,它不起作用,我怀疑这与当模拟实例在被测试的方法中实例化时,它没有实际提供模拟实例有关

这是一个我们无法真正更改的遗留代码库,因此我们只能使用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))
}
在单元测试中,我尝试执行以下操作:

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总是空的,然后下一段代码总是失败

编辑:

看起来这一行可能是问题所在,尽管看看其他例子,它应该会起作用

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

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

以下使用
whenNew
ObjectMapper
成功:

@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
,但它在其他方面与您的示例一致,并且具有功能性

以下使用
whenNew
ObjectMapper
成功:

@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
,但它在其他方面与您的示例一致,并且具有功能性

你能分享测试类的定义吗?它是用
@PrepareForTest
注释的吗?我用真实的代码做了一个例子,因为它不允许共享,但是这个类用@PrepareForTest注释,并且它有ObjectMapper.class以及正在测试的类
doReturn
调用是问题所在。应该是
Mockito.when(mapper.readValue(…,…)。然后返回(…)。请参阅。您可以共享测试类的定义吗?它是用
@PrepareForTest
注释的吗?我用真实的代码做了一个例子,因为它不允许共享,但是这个类用@PrepareForTest注释,并且它有ObjectMapper.class以及正在测试的类
doReturn
调用是问题所在。应该是
Mockito.when(mapper.readValue(…,…)。然后返回(…)。看见