PowerMock когдаNew не возвращает поддельный экземпляр - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь использовать PowerMock, чтобы прервать вызов Jackson ObjectMapper, но по какой-то причине он не работает, и я подозреваю, что это связано с тем, что на самом деле, когда NotNew не предоставляет проверенный экземпляр, когда он создается в тестируемом методе.

Это устаревшая кодовая база, которую мы не можем реально изменить, поэтому мы застряли с использованием 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 всегда равен нулю, а затем следующий раздел кода всегда терпит неудачу.

Редактировать:

Похоже, проблема в этой строке, хотя, глядя на другие примеры, она должна работать.

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

Я также пробовал isA и eq напоследний аргумент без удачи, все еще возвращает ноль.

1 Ответ

0 голосов
/ 25 мая 2018

Следующее использование 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, в остальном оно соответствует вашему примеру и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...