摩模拟一种调用lambda的方法,并验证该lambda调用的另一个模拟



我的问题,这与此相似:

使用Mockito;是否可以模拟一种将lambda作为参数的方法并断言lambda捕获的变量?

,但与众不同,我仍然花了一段时间才能弄清楚这一点是:

我如何验证一种通过模拟使用的方法,该方法被传递给了另一个模拟对象的方法?

例如
JDBI MyDBConnection

您应该嘲笑。然后与Fisthandle方法一起使用,以传递实现HandleCallback< r,X>的lambda。类型:

//code I'm testing. I implement the lambda, 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))被调用。

就像我说的那样,这是相似的,但与众不同,至少我会发现这个答案在我忘记如何做到这一点的时候很有价值。因此,调用我的lambda的原始第三方库方法类似于上述问题中给出的答案,但进行了一些调整:

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 lambda = (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));
  }
)

请参阅问题,应在上面充分回答;)

我正在尝试做一些非常相似的事情,与验证在测试中通过模拟jdbi呼叫中传递给withHandle的另一个模拟的参数。

您在问题中给出的答案将我指向正确的方向,但给我错误消息:

The method then(Answer<?>) in the type OngoingStubbing<Object> is not applicable for the arguments ((<no type> invocationOnMock) -> {})

相反,我必须使用传递给then的新的org.mockito.stubbing.Answer,类似于您链接到的另一个问题。

在您的示例中,这将是:

when(JDBIMock.withHandle(any())).then(
  //Answer<Void> lambda
  new Answer<Void>() {
    @Override
    public Void answer(InvocationOnMock invocation) throws Throwable {
      Object[] args = invocation.getArguments();
      assertEquals(1, args.length);
      //the interface def for the callback passed to JDBI
      HandleCallback lambda = (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));
      return null; // to match the Void type
    }
  }
)

在我的情况下,我期望withHandle的结果列表,因此我必须更改Answer类型,然后返回answer的类型以匹配并返回虚拟列表,而不是Void(在此测试中返回的实际结果并不重要,只是将预期的论点传递给了我随后的模拟对象)

我还将verify呼叫移到了Answer之外,使我的测试主体更清楚,这是对测试的期望,而不是模拟设置的一部分。

最新更新