我们有许多使用@Before和@After注释的测试类来执行测试构建/销毁。
但是因为我们现在需要对测试失败执行操作,但在执行@After之前,我们已经使用RuleChain来处理测试构建/破坏。它只是指向setUp()和tearDown()方法(是的,我们很幸运,大多数开发人员都坚持这种约定。)
问题是JUnit仍然调用@Before和@After注释的方法,并通过新规则调用它们。
它的核心是JUnit正在调用
org.junit.internal.runners.statements.RunAfters.evaluate
表示最内层的陈述。
显然,一个选项是从测试中删除@Before和@After注释,但我们正在讨论数百个测试。
我们如何关闭@Before和@After的处理?
答案 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
注释将无效。