首页 文章

如果在执行过程中抛出具体异常,将跳过测试的junit如何创建自己的注释?

提问于
浏览
4

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

提前致谢!

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

@Test(expected=ConcreteException.class)

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

@Solution对我有用(junit v4.7)thx到@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);
                }
            }
        };
    }
};

@谢谢

3 回答

  • 6

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

    @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);
                     }
                 }
             };
        }
    };
    
  • 0

    怎么用JUnit Extensions

    以下示例取自Tutorial .

    它为先决条件(@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 ;
        }
    }
    
  • 2

    我搜索了关于JUnit的文档,看起来从版本4.9开始他们引入了他们称之为测试规则的东西(参见TestRule) . 你可以从这开始 .

    标记为 @RuleExpectedException类可以提供一些帮助,以便检查抛出的异常但不是强制要求传递的测试 .

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

相关问题