Mockito;Смоделируйте метод, который вызывает lamdba, и проверьте другой макет, вызванный этой лямбдой. - PullRequest
0 голосов
/ 22 февраля 2019

Мой вопрос, который был похож на это:

Использование 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));
  }
)

1 Ответ

0 голосов
/ 22 февраля 2019

Смотри вопрос, на него надо ответить достаточно выше;)

...