如何配置 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
注释将无效。
我们有很多测试 类,它们用 @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
注释将无效。