鉴于每个junit测试必须在以下包装器中运行的要求:
@Test
public void testFooBar() {
SpecialLogic.runWith(new SpecialLogic("blah", "foo", ANYTHING), () -> {
// my test
});
}
我试图避免为每个测试添加SpecialLogic.runWith(...)
。
使用@BeforeEach或任何其他方式是否有可能?
否则,会有很多重复的代码:
@Test
public void testFooBar_2() {
SpecialLogic.runWith(new SpecialLogic("blah", "foo", ANYTHING), () -> {
// my test logic 2
});
}
@Test
public void testFooBar_3() {
SpecialLogic.runWith(new SpecialLogic("blah", "foo", ANYTHING), () -> {
// my test logic 3
});
}
有两种方法可以做到这一点:
-
编写您的自定义运行器,所有测试都必须使用此运行器运行。 如果您已经使用其他跑步者(例如弹簧或模拟),这可能不合适
-
编写自己的规则。该规则是执行您要求的操作的更新方式, 而且它不会"占用"只能是一个跑步者的插槽。
公共最终类 SampleRule 实现 TestRule {
@Override public Statement apply(final Statement base, final Description description) { return new Statement() { @Override public void evaluate() throws Throwable { // do your stuff before actually running the test try { base.evaluate(); // This line actually runs the test. } finally { // do your stuff after running a test } } };}}
以下是编写规则的众多指南之一:
看起来您应该实现自己的TestRunner
,以围绕每个测试方法调用包装自定义逻辑。Baelung有一篇文章解释了它是如何工作的。
@Before和@After? 它不会使用闭包,但在功能上应该是相同的。
https://junit.org/junit4/javadoc/latest/org/junit/Before.html https://junit.org/junit4/javadoc/latest/org/junit/After.html