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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何选择性地将某些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将某些测试标记为跳过?

答案

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

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

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可能是更好的解决方案。

另一答案

谢谢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);
}

以上是关于如何选择性地将某些junit测试标记为失败,将某些测试标记为跳过的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上的某些情况下,将图像扭曲为四边形会失败

如何表明 PHPUnit 测试预计会失败?

当@before节中的代码失败时Junit将执行@Test案例吗?

如何使 JUnit 测试用例按顺序运行?

Intelij 2019.1更新中断JUnit测试

如何将某些文件标记为 docker 是 Vscode? [复制]