我正在编写jUnits并被Lambda表达式所困扰。

有没有办法模拟匿名函数?

  return retryTemplate.execute(retryContext -> {
     return mockedResponse;
  });


在上面的代码中,我试图模拟retryTemplate
retryTemplate的类型-org.springframework.retry.support.RetryTemplate

最佳答案

对我来说,@ encrest的解决方案不起作用。

RetryTemplate mockRetryTemplate = Mockito.mock(RetryTemplate.class);
Mockito.when(mockRetryTemplate.execute(Matchers.any(RetryCallback.class))).thenReturn(mockedResponse);


我收到此错误:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
3 matchers expected, 1 recorded:
-> at test1(ServiceTest.java:41)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.


    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164)


这个错误似乎有点愚蠢,因为.execute()应该仅使用1个参数(因此使用1个匹配器)。另请参见non-sensical

查看RetryTemplate来源时,有4种.execute()方法。一个带有3个参数。因此,我认为这与Matchers无法使用正确的方法有关。

最终解决方案:

RetryTemplate mockRetryTemplate = Mockito.mock(RetryTemplate.class);
Mockito.when(mockRetryTemplate.execute(Matchers.any(RetryCallback.class), Matchers.any(RecoveryCallback.class), Matchers.any(RetryState.class))).thenReturn(mockedResponse);


我可以将其添加到原始问题中:Matcher为什么不能解析为一参数方法?

08-07 00:01