use*_*710 3 java java-8 functional-interface
我们有以下场景:
测试中,一些上下文变量需要更新。在测试中的确切位置以及确切应该发生的事情是可变的。我想提供一个“包装器”函数,它设置一些上下文变量,然后执行在函数调用中提供给它的所有断言。
因此,类似于以下内容:
public void withDefaultContextA(Function<???, Void> noArgsCall) {
setupDefaultContextA();
noArgsCall.invoke() // not sure how apply() would be invoked here
}
Run Code Online (Sandbox Code Playgroud)
或者:
public void withContextA(BiFunction<???, Context, Void> providedContextCall) {
setupContext(providedContext); // not sure how apply() would be invoked here
}
Run Code Online (Sandbox Code Playgroud)
在相应的测试中,这些应该被调用如下:
@Test
public void testSomething() {
withDefaultContextA(() -> {
... // do some asserts
}
withContext((new Context(...)) -> {
... // do some asserts
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?可以以这种方式使用 Java 8 函数吗?如果没有,还有另一种方法可以实现这一目标吗?
似乎你想装饰任何给定的Runnable(你在你的问题中使用Function和BiFunction,但当它们返回Void并且似乎没有收到任何参数时,使用Runnable在这里似乎更合适)。
你可以这样做:
public static void withDefaultContext(Runnable original) {
setupDefaultContextA();
original.run();
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以按如下方式使用上述方法:
withDefaultContext(() -> {
// do some asserts
});
Run Code Online (Sandbox Code Playgroud)
或者在特定的上下文中:
public static void withContext(Context context, Runnable original) {
setupContext(context);
original.run();
}
Run Code Online (Sandbox Code Playgroud)
用法:
withContext(new Context(...), () -> {
// do some asserts
});
Run Code Online (Sandbox Code Playgroud)