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

How can I configure JUnit to ignore @Before and @After annotations

我们有很多测试 类,它们用 @Before 和 @After 注释来执行测试 construction/destruction。

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

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

JUnit 的核心是调用

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

最里面的语句。

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

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

我认为您无法轻弹 JUnit 'switch' 来禁用此行为。 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

... 在您自己的代码库中,这些将 'replace' JUnit 等价物,如果它们的 evaluate() 方法主体为空,那么您使用 @Before@After 注释将无效。