я (еще) пытается проверить, если bar(Alpha, Baz)
называется bar(Xray, Baz)
использованием PowerMockito (как bar(Xray, Baz)
является private
) - фактически не называя позже, учитывая мой MCVE класс Foo
ниже. (Я прошел через тот же класс earlier, со всеми методами в Foo
быть public
- в случае, если у вас есть дежавю ...)PowerMockito бросает NullPointerException при попытке окурок личное перегруженный метод
public class Foo {
private String bar(Xray xray, Baz baz) {
return "Xray";
}
private String bar(Zulu zulu, Baz baz) {
return "Zulu";
}
public String bar(Alpha alpha, Baz baz) {
if(alpha.get() instanceof Xray) {
return bar((Xray)alpha.get(), baz);
} else if(alpha.get() instanceof Zulu) {
return bar((Zulu)alpha.get(), baz);
} else {
return null;
}
}
}
Когда я пытаюсь запустить тест ниже, я получаю NPE от PowerMock:
@RunWith(PowerMockRunner.class)
// @PrepareOnlyThisForTest(Foo.class) // we aren't looking at the byte code, I think
public class FooTest {
@Test
public void testBar_callsBarWithXray() throws Exception {
Baz baz = new Baz(); //POJOs
Alpha alpha = new Alpha();
alpha.set(new Xray());
Foo foo = new Foo();
Foo stub = spy(foo); // using Mockito, as it's neither final nor "not spyable"
// NPE at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.addAnswersForStubbing(PowerMockitoStubberImpl.java:67)
PowerMockito.doReturn("ok").when(stub, "bar", Xray.class, Baz.class);
stub.bar(alpha, baz);
// Testing if bar(Xray, Baz) was called by bar(Alpha, Baz)
PowerMockito.verifyPrivate(foo).invoke("bar", Xray.class, Baz.class);
// Mockito's equivalent for a public method: verify(stub, times(1)).bar(any(Xray.class), any(Baz.class));
}
}
Если я окурок PowerMockito.spy(foo)
, я получаю IllegalArgumentException: argument type mismatch at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:2014)
вместо этого. (Он пузырится вверх по той же линии, что и NPE.)
Я использую Mockito-core 1.9.5, PowerMock 1.5.4 (module-junit4 и api-mockito) и JUnit 4.11.
Что мне нужно изменить, чтобы исключить возможность исключения? Как я могу сделать эту тестовую работу? (Кроме testing that мой класс работает, а не как ... ;-))
Хмм, если я изменю, что в 'PowerMockito.verifyPrivate (тупиковые, раз (5)). Вызова ("бар", Matchers.any (Xray.class), Matchers.any (Baz.class)) ; выясняется, что вы проверяете, как часто вы вызываете 'String res = stub.bar (alpha, baz);' - он, похоже, не смотрит на 'Foo'. Что имеет смысл, так как 'any()' всегда возвращает 'void', насколько я знаю, поэтому PowerMock не имеет возможности проверять типы во время выполнения и соответствует строке bar (Alpha, Baz)'. – Christian
Изменение его на 'Метод m = Whitebox.getMethod (Foo.class, Xray.class, Baz.class);' 'PowerMockito.doReturn (« ok »). Когда (заглушка, m) .withArguments (any (Xray.class), любой (Baz.class)); 'for' times (5) 'просто заставляет его терпеть неудачу с' Wanted, но не вызывается: foo.bar (, ); -> at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) На самом деле было нулевое взаимодействие с этим mock.' –
Christian
@Christian, мой первый ответ не издевался над методом частного бара, вместо этого он издевался над методом публичных баров, я исправил метод тестирования с помощью MemberMatcher.method, Посмотрите на подробное объяснение в моем обновленном ответе. – kswaughs