java - 跳过@Before 进行测试 ||有没有办法在 TestRule 中执行 @Before 方法?

标签 java unit-testing junit4 junit-rule

高级,我有非常简单的 JUnit 测试类。我有几个 @Tests 和一个 @Before 做一些设置。对于一个测试用例,设置会有所不同(我不希望它运行)。

通过一些搜索我找到了 https://stackoverflow.com/a/13017452/413254 .这建议创建一个 @Rule 来检查特定注释并执行 @Before 语句。

我的困惑在于如何在规则中执行@Before 方法。有没有办法做到这一点?或者我是否需要传入测试类本身并执行@before 方法(下例中的setup())?

public class NoBeforeRule implements TestRule {

    @Override
    public Statement apply(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                if (description.getAnnotation(NoBefore.class) == null) {
                    // Is there something like `base.executeAllTheBefores()' 
                }

                base.evaluate();
            }
        };
    }
}

相关测试代码:

@Rule public NoBeforeRule mNoBeforeRule = new NoBeforeRule(this);

@Before
@Override
public void setup() {
}

@Test
public void testNeedSetup() {
    // this should run setup()
}

@NoBefore
@Test
public void testNoSetup() {
    // this should NOT run setup()
}

最佳答案

为什么不将测试分成两个单独的测试类?需要设置的进入一类,不需要设置的进入另一类。

没有规则(甚至指南)规定一个类的所有测试都必须进入一个测试类,事实上,这是我经常做的事情。

如果您有一个或多个不需要通用设置的测试,这可能表明测试本身没有内聚性,并且正在测试被测类的不同变体。例如,我可能有一堆方法,这些方法以特定方式为正面测试设置了模拟设置,但是其他需要它的测试针对失败场景进行了不同的配置。我会将这些测试分为两类 - 特别是针对积极场景的测试和针对失败场景的测试。

玩弄规则之类的明确避免运行标准@Before方法只会让事情变得更复杂,让你 future 的自己或同事抓挠他们的关于为什么没有运行设置方法的原因

关于java - 跳过@Before 进行测试 ||有没有办法在 TestRule 中执行 @Before 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29543230/

相关文章:

java - 将 byte[] 编码为 String

python - 以编程方式获取单元测试的结果

java - 在没有 JUnit 的情况下运行 Cucumber 的替代方法?

对注入(inject)了另一个 ejb 的 ejb3.0 进行单元测试

Java泛型?扩展克拉兹

java - 规范jvm : How to execute outside installation folder

java - 使用 Unicode post 数据解析 application/x-www-form-urlencoded 时出错

java - 你如何使用 spring 的注入(inject)来对 Controller 进行单元测试?

unit-testing - OCMock -[NSURLSessionDataTask 响应] 在 iOS 9 中无法识别的选择器崩溃

java - junit - 如何在真实类中模拟字段?