Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JUnit配置为忽略@Before和@After注释_Junit_Junit4 - Fatal编程技术网

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

如何将JUnit配置为忽略@Before和@After注释,junit,junit4,Junit,Junit4,我们有许多用@Before和@After注释的测试类来执行测试构造/销毁 但是,因为我们现在需要在测试失败时执行操作,但在@After执行之前,我们已经使用了一个规则链来自行处理测试构造/销毁。它只是指向了setUp和tearDown方法是的,我们很幸运,大多数开发人员都遵守了这个约定 问题是JUnit仍然调用带有@Before和@After注释的方法,并通过新规则调用它们 JUnit的核心是调用 org.junit.internal.runners.statements.RunAfters.e

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

但是,因为我们现在需要在测试失败时执行操作,但在@After执行之前,我们已经使用了一个规则链来自行处理测试构造/销毁。它只是指向了setUp和tearDown方法是的,我们很幸运,大多数开发人员都遵守了这个约定

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

JUnit的核心是调用

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);
    }
}