Ale*_*ean 2 java lambda unit-testing mockito
我在编写涉及模拟lambda的单元测试时遇到了一个有趣的问题。
@Test
public void spyingLambda() {
final Supplier<String> spy = Mockito.spy((Supplier) () -> "1");
spy.get();
}
Run Code Online (Sandbox Code Playgroud)
运行此测试失败,并显示以下错误:
Mockito无法模拟/间谍,因为:-最终班
上述问题的一种解决方法是将lambda替换为匿名实现:
@Test
public void spyingAnonymousImplementation() {
final Supplier<String> spy = Mockito.spy(new Supplier<String>() {
@Override
public String get() {
return "1";
}
});
spy.get();
}
Run Code Online (Sandbox Code Playgroud)
尽管两个测试完全相同(IDE建议甚至将匿名实现替换为lambda),但第二个测试不会失败。
我想知道这是否是一个已知问题,可以通过模仿解决,还是有其他解决方法。
仅供参考,为了改进@alex的答案,你也可以这样做
public static <T> T spyLambda(final T lambda) {
Class<?>[] interfaces = lambda.getClass().getInterfaces();
MatcherAssert.assertThat(interfaces, IsArrayWithSize.arrayWithSize(1));
return Mockito.mock((Class<T>) interfaces[0], delegatesTo(lambda));
}
Run Code Online (Sandbox Code Playgroud)
然后简单地监视它而不指定类型(例如,Supplier.class)
Callable<Integer> callable = spyLambda(() -> {
return 42;
});
Supplier<Integer> supplier = spyLambda(() -> 42);
Runnable runnable = spyLambda(() -> System.out.println("42"));
Run Code Online (Sandbox Code Playgroud)
解决此问题的另一种方法是:
/**
* This method overcomes the issue with the original Mockito.spy when passing a lambda which fails with an error
* saying that the passed class is final.
*/
public static <T> T spyLambda(final Class<T> lambdaType, final T lambda) {
return mock(lambdaType, delegatesTo(lambda));
}
Run Code Online (Sandbox Code Playgroud)
通过更改以下第一种方法,可以监视lambda:
@Test
public void spyingLambda() {
final Supplier<String> spy = spyLambda(Supplier.class, () -> "1");
spy.get();
}
Run Code Online (Sandbox Code Playgroud)
希望以上示例可以对遇到相同问题的其他人有所帮助。
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |