Для параллельного разговора по вопросу "Вызов обратных вызовов с помощью Mockito" , ваша лямбда может быть вызвана синхронно во время выполнения тестируемого вами метода, или она может быть вызвана позже на основе некоторого внешнего фактор или взаимодействие. Как и ответ Дауда там , ваш ответ здесь с использованием ответа Mockito будет работать, и это единственный путь, если вы ищете синхронный стиль (где mockJdbi
вызывает вашу лямбду непосредственно перед возвращением methodUnderTest
). Если ваши лямбды будут вызываться асинхронно или если ваша система допускает асинхронный вызов лямбды, вы можете захотеть проверить состояние после того, как тестируемый метод вернет , но , прежде чем взаимодействовать с лямбда .
// MockitoJUnitRunner, MockitoRule, or MockitoAnnotations.initMocks populate these.
// Especially useful for the ArgumentCaptor's generic arguments.
@Mock Jdbi mockJdbi;
@Mock OrgUnitDao mockOrgUnitDao;
@Captor ArgumentCaptor<ExtensionConsumer<OrgUnitDao, RuntimeException>>
extensionConsumerCaptor;
@Test public void yourTest() throws Exception {
// No stubbing needed! Just create the system under test.
YourSystemUnderTest systemUnderTest = new YourSystemUnderTest(mockJdbi);
// Call the method under test, which presumably calls useExtension(...).
systemUnderTest.methodUnderTest();
// Assert anything that should be true before the lambda is called.
assertFalse(systemUnderTest.getSomeState());
// Confirm that useExtension was called, and simultaneously acquire the lambda.
// ArgumentCaptor.capture() is a matcher, so every argument requires a matcher like eq.
verify(mockJdbi).useExtension(eq(OrgUnitDao.class), extensionConsumerCaptor.capture());
// Prepare the mock DAO and call the lambda.
when(mockDao.getFoo()).thenReturn("bar");
extensionConsumerCaptor.getValue().useExtension(mockDao);
// Assert anything that should be true after the lambda is called.
assertTrue(systemUnderTest.getSomeState());
}
Хотя лямбды уменьшают шаблон, ранее связанный с анонимными внутренними классами, вы также можете предпочесть использование стиля Captor, поскольку он избавляет вас от создания длинных реализаций ответа и скрытия в них ваших тестовых утверждений или проверок Mockito. Это особенно заманчиво, если ваш проект предпочитает макеты в стиле BDD с четкой структурой «дан-когда-тогда» (хотя мой пример более похож на «дан-когда-тогда-тогда-тогда»).