如何选择性地将某些junit测试标记为失败,将某些测试标记为跳过

时间:2018-02-24 19:19:44

标签: java maven junit

我有测试:

public class MyTest {

@Test
public void test_1(){
    assertTrue(false);
}

@Test
public void test_2(){
    assertTrue(false);
}

和CustomListener:

public class CustomerListener extends RunListener {

   @Override
   public void testFailure(Failure failure) throws Exception {
      if(some_condition) {
        super.testAssumptionFailure(failure);
      } else {
        super.testFailure(failure);
      }
 }

使用maven运行测试:

mvn test -Dtest=MyTest.java

CustomerListener工作但所有时间测试标记为失败('some_condition'为真)。如何使用CustomerListener将某些测试标记为跳过?

2 个答案:

答案 0 :(得分:0)

RunListener对你不起作用,因为listener方法只会被JUnit调用,以通知听众发生的事件。侦听器无法干扰或停止事件本身的执行。

如果将忽略测试方法(如here所述),您需要一个可以在运行时控制的自定义JUnit运行器:

public class MyRunner extends BlockJUnit4ClassRunner {
    public MyRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }
    @Override
    protected boolean isIgnored(FrameworkMethod method) {
        if(method.getName().equals("test_1")) {
            return true;
        }
        return super.isIgnored(method);
   }
}

然后可以在您的测试类中使用:

@RunWith(MyRunner.class)
public class MyTest {

    [...]
}

但正如khmarbaise所提出的,使用assume可能是更好的解决方案。

答案 1 :(得分:0)

谢谢werner,但我找到了下一个解决方案

 public class CusomIgnoreRule implements TestWatcher {
   @Override
public Statement apply( final Statement base, final Description description ) {
    return new Statement() {
        @Override
        public void evaluate() throws Throwable {
            try {
                base.evaluate();
            }
            catch ( Throwable t ) {
                if(some_condition) {
                   throw new AssumptionViolatedException("do this so our test gets marked as ignored")
                }
                throw t; 
            }
        }
    };
}

并且在测试中:

public class MyTest {

@Rule
public CusomIgnoreRule rule = new CusomIgnoreRule();

@Test
public void test_1(){
    assertTrue(false);
}

@Test
public void test_2(){
    assertTrue(false);
}