模拟匿名函数



我正在编写jUnits,但遇到了Lambda表达式。

有没有一种方法可以模拟匿名函数?

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

在上面的代码中,我试图模拟retryTemplateretryTemplate属于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()应该只使用一个参数(因此也只有一个匹配器(。另见无意义。

在研究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不能解析为单参数方法

假设"retryTemplate"是某个bean"myBean"中的依赖项,我会使用依赖项注入来模拟使用Mockito的"retryTemplate.execute"方法,并将其配置为接受任何参数:

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

如果我只是试图将一个参数模拟为一个方法,其中该参数恰好是lambda,我可能只会创建一个新的lambda表达式存根,而不是尝试模拟它

相关内容

  • 没有找到相关文章

最新更新