Как мы можем заменить тело метода метода пустоты заглушки? Что-то вроде этого:Обрезание метода пустоты в mockito с побочными эффектами
interface Foo {
void foo(Integer j);
}
(...)
Foo mockFoo = mock(Foo.class);
Answer<Void> ans = invocation -> {
Object[] args = invocation.getArguments();
System.out.println("called with arguments: " + Arrays.toString(args));
return null;
};
when(mockFoo.foo(any())).thenAnswer(ans);
(...)
mockFoo.foo(5) // Should print out "called with arguments: [5]"
Важно, чтобы иметь возможность получить доступ к параметрам, и, чтобы иметь возможность выполнить некоторый код, который использует эти параметры.
Мы пытались doAnswer(ans).when(mockFoo).foo(any());
, но это, кажется, выполнить тело АНС лямбда несколько раз при настройке издеваться, и он сбрасывает нашу переменную mockFoo в «нулевой» по какой-то странной причине между .when(mockFoo)
и .foo(any())
вызовов.
Так эффективно:
Foo mockFoo = mock(Foo.class)
// mockFoo is an instance of a Foo$MockitoMock
Foo o = doAnswer(ans).when(mockFoo);
// mockFoo just became null at this point..?!
o.foo(any());
P.S. Мы используем VertxUnitRunner для запуска теста, но проблема сохраняется и с MockitoJUnitRunner.
Спасибо, Акос VÄNDRA
См. Http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito – pringi
То, что у вас есть, является правильным, и, безусловно, нет причин, по которым 'mockFoo' должен быть сброшен. Вместо отрывков, которые вы опубликовали, можете ли вы показать нам фактическую настройку тестового тела? Я чувствую, что ваша проблема там, а не код, который вы опубликовали. –
@JeffBowman Вы были правы. В моем фактическом тесте я поставлял any() как параметр для int, который, по-видимому, был причиной. Замена его на anyInt() устраняет проблему. –