PowerMockito.mockStatic (), но все еще получает NPE при вызове статического метода - PullRequest
0 голосов
/ 29 января 2019

ПРИМЕЧАНИЕ. Я отметил 3 LINE числа, которые я обсуждаю в своем вопросе. Возможно, вам потребуется прокрутить вправо в фрагментах кода, чтобы увидеть.

Я действительно изо всех сил пытаюсь выполнить модульноеметод с цепочкой Optional.map() s.

@Override
public void accept(Object message)
{
    extractSenderReference(message.toString())
        .map(t ->
        {
            t.setTransactionStatus("TAG1"); //  <- LINE #1
            return t;
        })
        .map(StaticConverter::convert) //< -LINE #2
        .ifPresent(Persist::persist);
}

Где extractSenderReference() возвращает Optional типа Obj и является закрытым методом.

И мой тест:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassBeingTested.class, StaticConverter.class})

public class MyTest {

private ClassBeingTested updateProcessor = PowerMockito.spy(new ClassBeingTested());
private StatusDataObj statusDataObj = mock(StatusDataObj.class);

@Test
public void testSomething() throws Exception{
    Obj myObj = getObj();
    PowerMockito.mockStatic(StaticConverter.class);

    PowerMockito.doReturn(Optional.ofNullable(myObj)).when(updateProcessor, "extractSenderReference", anyString()); // <- LINE #3
    when(StaticConverter.convert(myObj)).thenReturn(statusDataObj);
    updateProcessor.accept("MESSAGE1");
}

private Obj getObj(){
    Obj obj = new Obj();
    obj.setId(100L);
    return obj;
 }
}

В LINE #1, как отмечено в моем методе accept(), объект t был обработан, и его transactionStatus был успешно установлен.Однако в LINE #2 я получаю NPE при выполнении вышеуказанного теста.

Я также пробовал PowerMockito.spy(StaticConverter.class); вместо PowerMockito.mockStatic(StaticConverter.class); согласно https://github.com/powermock/powermock/wiki/Mockito#mocking-static-method, но я получаю то же самоеNPE.

Я думал, что карта конвертирует t в StatusDataObj тип.Поэтому, когда карта вызывает convert, я заглушу и верну свой тип.Однако изначально я ожидал, что LINE #3 эффективно позаботится о цепочечных вызовах map для Optional, возвращаемых из extractSenderReference(), поскольку я использую реальный объект с установленными значениями, но должен быть нулевойзначение где-то еще?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Попробуйте заменить ссылку на метод StaticConverter::convert явным лямбда-вызовом фактического метода: e -> StaticConverter.convert(e).

У меня были проблемы со ссылками на метод имитации Powermock, но я оставил его как явный методЗвонок, я мог бы успешно издеваться над этими звонками.

0 голосов
/ 31 января 2019

Persist был нулевым.Я не уверен, почему NPE был в LINE 2.

0 голосов
/ 29 января 2019

Вам нужно добавить классы к @PrepareForTest, с которым вы будете работать в этом тесте:

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticConverter.class, ClassBeingTested.class)

Powermock должен знать, что вы будете использовать его для этих классов.

...