Мой вопрос, который был похож на это:
Использование mockito;Можно ли смоделировать метод, который принимает лямбду в качестве параметра и утверждать переменные, захваченные лямбда?
Но достаточно отличается, что мне все еще нужно время, чтобы понять это было:
Как мне проверить, что метод, вызванный макетом, который использовался внутри lamdba, был передан методу другого фиктивного объекта?
Это может показаться запутанным, но это часто случается с библиотеками Java 8, такими как JDBI, например, у вас есть объект JDBI:
JDBI MyDBConnection
То, что вы должны насмехаться.И затем это используется с методом withHandle для передачи lamdba, реализующего HandleCallbackвведите:
//code I'm testing. I implement the lamdba, and want to verify it
//calls the correct method in dao provided by JDBI.
MyDBConnection.withHandle(
(handle) -> { ... handle.attach(SomeDao.class).findSomethingInDB(args) .. }
Какой рекомендуемый способ сделать это.
Поэтому я хочу убедиться, что findSomethingInDB (eq (args)) вызывается.
Как и ясказал, что это было похоже, но достаточно отличается, что, по крайней мере, я найду этот ответ ценным в будущем, когда забуду, как это сделать.Таким образом, оригинальный сторонний библиотечный метод, который вызывает мою lamdba, обрабатывается аналогично ответу, приведенному в вопросе, указанном выше, но с некоторыми изменениями:
when(JDBIMock.withHandle(any())).then(
//Answer<Void> lambda
invocationOnMock -> {
Object[] args = invocationOnMock.getArguments();
assertEquals(1, args.length);
//the interface def for the callback passed to JDBI
HandleCallback lamdba = (HandleCallback) args[0];
when(mockHandle.attach(SomeDao.class)).thenReturn(mockDao);
//this actually invokes my lambda, which implements the JDBI interface, with a mock argument
lambda.withHandle(mockHandle);
//bingo!
verify(mockDao).findSomethingInDB(eq(args));
}
)