2016-07-01 2 views
0

Я новичок в PowerMockito, и есть поведение, которое он показывает, чего я не понимаю. Следующий код объясняет мой вопрос:PowerMockito вызывает метод, когда я использую doReturn (..). Когда (....)

public class ClassOfInterest { 

    private Object methodIWantToMock(String x) { 

    String y = x.trim(); 

    //Do some other stuff; 
    } 

    public void methodUsingThePrivateMethod() { 

    Object a = new Object(); 
    Object b = methodIWantToMock("some string"); 

    //Do some other stuff ... 
    } 
} 

У меня есть класс, который содержит приватный метод, который я хочу псевдотрансфицированные называется methodIWantToMock(String x). В моем тестовом коде, я делаю следующее:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassOfInterest.class) 
public class ClassOfInterestTest { 

    @Test 
    public void someTestMethod() { 

    ClassOfInterest coiSpy = PowerMockito.spy(new ClassOfInterest()); 

    PowerMockito.doReturn(null).when(coiSpy, "methodIWantToMock", any(String.class)); 

    coiSpy.methodUsingThePrivateMethod(); 

    //Do some stuff ... 

    } 
} 

В соответствии с вышеуказанным кодом, PowerMockito должен просто возвращать нуль, когда methodIWantToMock вызывается внутри methodUsingThePrivateMethod() когда я запустить тест выше. Однако на самом деле происходит то, что когда эта команда запущена: PowerMockito.doReturn(...).when(...), PowerMockito на самом деле звонит methodIWantToMock прямо сейчас и там! Почему это так? На этом этапе я хотел только указать, как он должен макет частного метода, когда он в конечном итоге вызывается при запуске линии coiSpy.methodUsingThePrivateMethod();.

+0

Вы вызываете 'methodUsingThePrivateMethod()' на макете объекта, который, в свою очередь, вызывающий 'methodIWantToMock («некоторые строки»)' внутренне. Какое поведение вы ожидали здесь? –

+0

Это правильно, однако через отладку я обнаружил, что PowerMockito вызывает 'methodIWantToMock()', когда я запускаю 'doReturn(). When()' command. Он не ждет 'methodUsingThePrivateMethod()', чтобы вызвать его. – Ahmad

+0

Я нашел это поведение путем отладки. Если я запускаю тест (без отладки), тест выходит из строя из-за 'NullPointerException', сгенерированного, потому что, когда выполняется команда' doReturn (...). When (...) ', PowerMockito запускает закрытый метод при передаче' null' в качестве ввода, и поэтому, когда 'String y = x.trim();' выполняется внутри 'methodUsingThePrivateMethod()', генерируется «NullPointerException». Нижняя строка === команда 'coiSpy.methodUsingThePrivateMethod();' НИКОГДА НЕ ВКЛЮЧАЕТ. – Ahmad

ответ

1

Итак, я понял, какое решение работает для меня. Вместо использования spy я использовал mock, а затем сказал PowerMockito назвать реальный метод, когда methodUsingThePrivateMethod() вызывается внутри моего издеваемого объекта. По сути, он делает то же самое, что и раньше, но просто использует mock вместо spy. Таким образом, PowerMockito НЕ приводит вызов частного метода, поведение которого я пытаюсь контролировать с помощью PowerMockito.doReturn(...).when(...). Вот мой модифицированный тестовый код. Линии I изменены/добавлены маркируются:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassOfInterest.class) 
public class ClassOfInterestTest { 

    @Test 
    public void someTestMethod() { 

    //Line changed: 
    ClassOfInterest coiMock = PowerMockito.mock(new ClassOfInterest()); 

    //Line changed: 
    PowerMockito.doReturn(null).when(coiMock, "methodIWantToMock", any(String.class)); 

    //Line added: 
    PowerMockito.when(coiMock.methodUsingThePrivateMethod()).thenCallRealMethod(); 

    coiSpy.methodUsingThePrivateMethod(); 

    //Do some stuff ... 

    } 
}