是否可以覆盖子类测试脚本中的junit规则?

时间:2014-03-26 16:07:41

标签: java junit

我有一个基本的测试类,我的所有其他测试用例都从中继承。

在超类中,我通过以下方式设置全局计时器:

@Rule 
public Timeout globalTimeout = new Timeout(30000);

但是,对于子类中的某些方法,我希望超时更长。

例如:

@test(timeout=alongtime)
private void sometTest()

但这似乎根本不会影响全局计时器,我通过设置全局非常短的超时和子类中的超长超时来测试。

有没有办法让JUnit尊重在方法上定义的超时?

2 个答案:

答案 0 :(得分:2)

显然jUnit项目here中存在一个未解决的问题,似乎他们正在考虑在项目中重构Timeout的整个概念。

但在此期间,我一直在寻找同样的事情,发现this post不使用Timeout规则,而是另一个就像解决方法一样。

例如在我的情况下,我有一些支持谁是快速的和其他一些慢,我只是创建了两个不同的超时的观察者:

@Rule
public TestWatcher watcher = new TestWatcher() {
    @Override
    public Statement apply(Statement base, Description description) {

        if (description.getMethodName().toLowerCase().contains("slow")) {
            return new FailOnTimeout(base, 15000);
        } else {
            return new FailOnTimeout(base, 5000);
        }
    }
};

这显然不是适合所有人的解决方案(取决于您如何命名测试)但我发现它很有趣,尤其是在“集成测试”或“持续集成”环境中使用jUnit框架时。

<强>更新

我找到了一种更好的方法:对缓慢的请求使用特定的自定义注释:

@Target(METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SlowRequest {

    // Just for tagging a method and adapt the timeout
}

并且Watcher代码将是:

if (description.getAnnotation(SlowRequest.class) != null) {
    return new FailOnTimeout(base, 60000);
} else {
    return new FailOnTimeout(base, 25000);
}

并在测试中自己:

@Test
@SlowRequest
public void testSlowMethod() {
   // slow test here
}

答案 1 :(得分:1)

  

我有一个基本的测试类,我的所有其他测试用例都从中继承。

不要那样做。

使用继承来共享测试代码不是很灵活。使用委托来共享代码。在这种情况下,只需将超时规则添加到需要它的测试类中。大多数测试应该是单元测试,不需要超时。

如果您的基类中有很多逻辑,请将其解压缩到另一个类(可能是自定义规则)。