如何配置JUnit以忽略@Before和@After注释

时间:2017-11-09 06:08:39

标签: junit junit4

我们有许多使用@Before和@After注释的测试类来执行测试构建/销毁。

但是因为我们现在需要对测试失败执行操作,但在执行@After之前,我们已经使用RuleChain来处理测试构建/破坏。它只是指向setUp()和tearDown()方法(是的,我们很幸运,大多数开发人员都坚持这种约定。)

问题是JUnit仍然调用@Before和@After注释的方法,并通过新规则调用它们。

它的核心是JUnit正在调用

org.junit.internal.runners.statements.RunAfters.evaluate

表示最内层的陈述。

显然,一个选项是从测试中删除@Before和@After注释,但我们正在讨论数百个测试。

我们如何关闭@Before和@After的处理?

1 个答案:

答案 0 :(得分:1)

我不认为你可以轻弹JUnit'切换'禁用此行为。 JUnit提供了两种更改测试执行行为的方法:

  • 延长BlockJUnit4ClassRunner
  • 在您的测试用例中添加Rule

这两个都需要您更改测试用例,其中第二个选项可能是最不具侵入性的(尽管这取决于您的测试用例是否已经使用自定义的运行程序)。

鉴于这个简单的JUnit跑步者:

public class IgnoreBeforeAndAfter extends BlockJUnit4ClassRunner {

    public IgnoreBeforeAndAfter(Class<?> klass) throws InitializationError {
        super(klass);
    }

    protected Statement withBefores(FrameworkMethod method, Object target,
                                    Statement statement) {
        return statement;
    }

    protected Statement withAfters(FrameworkMethod method, Object target,
                                   Statement statement) {
        return statement;
    }
}

以下测试用例将通过(从而证明未调用@Before@After方法):

@RunWith(IgnoreBeforeAndAfter.class)
public class SimpleTest {

    @Before
    public void setUp() {
        Assert.fail("The @Before method should be ignored!");
    }

    @After
    public void tearDown() {
        Assert.fail("The @After method should be ignored!");
    }

    @Test
    public void canIgnoreBeforeAndAfter() {
        assertTrue(true);
    }
}

您的代码库上的结构搜索+替换可用于将此批注添加到包含@Before@After中的至少一个的所有测试用例。

虽然结构搜索+替换当然也可以从您的代码中删除所有@Before@After注释。

一种不需要对现有测试用例进行更改(但有些不标准)的方法是提供无操作的实现......

  • org.junit.internal.runners.statements.RunAfters
  • org.junit.internal.runners.statements.RunBefores

...在您自己的代码库中,这些将取代&#39; JUnit等价物,如果他们的evaluate()方法体是空的,那么使用@Before@After注释将无效。