如何将每个测试嵌入到包装器逻辑中?



鉴于每个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
});
}

有两种方法可以做到这一点:

  1. 编写您的自定义运行器,所有测试都必须使用此运行器运行。 如果您已经使用其他跑步者(例如弹簧或模拟),这可能不合适

  2. 编写自己的规则。该规则是执行您要求的操作的更新方式, 而且它不会"占用"只能是一个跑步者的插槽。

    公共最终类 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

相关内容

  • 没有找到相关文章

最新更新