如何将JUnit配置为忽略@Before和@After注释
我们有许多用@Before和@After注释的测试类来执行测试构造/销毁 但是,因为我们现在需要在测试失败时执行操作,但在@After执行之前,我们已经使用了一个规则链来自行处理测试构造/销毁。它只是指向了setUp和tearDown方法是的,我们很幸运,大多数开发人员都遵守了这个约定 问题是JUnit仍然调用带有@Before和@After注释的方法,并通过新规则调用它们 JUnit的核心是调用如何将JUnit配置为忽略@Before和@After注释,junit,junit4,Junit,Junit4,我们有许多用@Before和@After注释的测试类来执行测试构造/销毁 但是,因为我们现在需要在测试失败时执行操作,但在@After执行之前,我们已经使用了一个规则链来自行处理测试构造/销毁。它只是指向了setUp和tearDown方法是的,我们很幸运,大多数开发人员都遵守了这个约定 问题是JUnit仍然调用带有@Before和@After注释的方法,并通过新规则调用它们 JUnit的核心是调用 org.junit.internal.runners.statements.RunAfters.e
org.junit.internal.runners.statements.RunAfters.evaluate
对于最里面的语句
一个选项显然是从测试中删除@Before和@After注释,但我们谈论的是数百个测试
我们如何才能关闭@Before和@After的处理?我认为你不能轻触JUnit的“开关”来禁用这种行为。JUnit提供了两种更改测试执行行为的方法: 扩展BlockJUnit4ClassRunner 将规则添加到测试用例中 这两个选项都要求您更改测试用例,其中第二个选项可能是侵入性最小的,尽管这取决于您的测试用例是否已经使用定制的运行程序 考虑到这个简单的JUnit runner:
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中一个的所有测试用例中
当然,结构化搜索+替换也可以从代码中删除所有@Before和@After注释
一种不需要更改现有测试用例但有点非标准的方法是不提供任何op实现
org.junit.internal.runners.statements.runafter
org.junit.internal.runners.statements.RunBefores
。。。在您自己的代码库中,这些注释将“替换”JUnit等价物,如果它们的evaluate方法体为空,则使用@Before和@After注释将不会产生任何效果 谢谢。使用RunWith看起来是一个很好的解决方案。不幸的是,我们的测试类已经用@RunWith注释,以使用从TestSuite扩展而来的2rd party Runner,而不是BlockJUnit4ClassRunner,所以我不能使用它。但是,通过使用TestClass定义TestRule注释,并使用TestClass查找前后注释,我至少可以记录日志,如果我发现会破坏我们的前后注释,则会失败。令人遗憾的是,BlockJUnit4 ClassRunner的功能没有在更高级别上公开。如果能够使用注释将所有行为(如BeforeClass、Before、AfterClass和After)注入到Runner中,那将是一件好事。是的,钩子的实现方式在简单的情况下可以很好地工作,但是随着需求的定制,选择测试执行流变得更加困难。
@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);
}
}