5

我的应用程序有几种执行模式,在 1 种模式下,我的一些测试会抛出一个具体的异常是正常的。我需要用 @SkipOnFail 之类的东西来注释这些方法,如果抛出异常,它会将方法设置为已跳过。

提前致谢!

@Edit(让我的问题更清楚)

@Test(expected=ConcreteException.class)

对我不起作用,因为即使未抛出 ConcreteException.class,我也需要通过测试(如果不抛出此异常,junit 中的预期标记会将我的测试标记为失败),否则将被跳过。在所有其他情况下,它应该像往常一样工作。

@Solution 对我有用(junit v4.7)感谢@axtavt

@Rule
public MethodRule skipRule = new MethodRule() {
    public Statement apply(final Statement base, FrameworkMethod method, Object target) {
        if(method.getAnnotation(SkipOnFail.class) == null) return base;

        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                try{
                    base.evaluate();
                } catch (ConcreteException e) {
                    Assume.assumeTrue(false);
                }
            }
        };
    }
};

@谢谢

4

4 回答 4

6

我不认为这样的功能是开箱即用的,但是使用customTestRule和应该很容易实现Assume,如下所示:

@Rule
public TestRule skipRule = new TestRule() {
    public Statement apply(final Statement base, Description desc) {
         if (desc.getAnnotation(SkipOnFail.class) == null) return base;

         return new Statement() {
             public void evaluate() throws Throwable {
                 try {
                     base.evaluate();
                 } catch (MyExceptoion ex) {
                     Assume.assumeTrue(false);
                 }
             }
         };
    }
};
于 2012-05-29T18:16:30.493 回答
2

使用JUnit 扩展怎么样?

以下示例取自他们的教程

它为先决条件(@Prerequisite)提供了附加注释:基于条件忽略测试。

所需的方法是在运行测试期间检查这一点。因此,您可以简单地添加@Prerequisite(requires="")注释。

public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable")
    @Test public void fillData() {
        // ...
    }

    public boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable;
    }
}
public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable")
    @Test public void fillData() {
        // ...
    }
    public boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable ;
    }
}

这个指定的方法@Prerequisite(requires = "databaseIsAvailable")必须是一个公共方法,返回一个布尔值或布尔值。

如果这些方法将合并到辅助类中,您还可以在要调用的类中指定静态方法,使用@Prerequisite(requires = "databaseIsAvailable", callee="DBHelper").

public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable", callee="DBHelper")
    @Test public void fillData() {
        // ...
    }
}
public class DBHelper {
    public static boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable ;
    }
}
于 2012-05-29T17:45:38.063 回答
1

同样使用 Assume 类(自 jUnit 4.4 起),您可以使用AssumeNoException()

try{
    base.evaluate();
} catch (ConcreteException e) {
    Assume.assumeNoException("Concrete exception: skipping test", e);
}
于 2019-05-28T03:32:40.583 回答
0

我搜索了有关 JUnit 的文档,似乎从 4.9 版开始,他们已经引入了他们所谓的测试规则(参见TestRule)。你可以从这个开始。

标记为的ExpectedException@Rule可能有助于检查抛出的异常,但不是强制通过测试。

对于更高级的用法,我暂时不能说,因为我刚刚发现它。

于 2012-05-29T18:09:36.613 回答