我正在编写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()
应该只使用一个参数(因此也只有一个匹配器(。另见无意义。
在研究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表达式存根,而不是尝试模拟它