从JUnit中的'before'方法中排除单个测试

Tom*_*ero 17 java testing junit

我的测试类中的所有测试在@Before执行每个测试之前执行'before'方法(使用JUnit注释).

我需要一个特定的测试,不要在方法之前执行它.

有办法吗?

Mat*_*ell 22

您可以使用TestRule执行此操作.您可以使用某些描述的注释标记要跳过之前的测试,然后,在TestRule的apply方法中,您可以测试该注释并执行您想要的操作,例如:

public Statement apply(final Statement base, final Description description) {
  return new Statement() {
    @Override
    public void evaluate() throws Throwable {
      if (description.getAnnotation(DontRunBefore.class) == null) {
        // run the before method here
      }

      base.evaluate();
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法从TestRule中轻松执行@Before语句?我想知道`//运行之前方法'部分最简单的方法. (4认同)

Joh*_*n B 17

考虑使用运行器@Enclosed允许您有两个内部测试类.一个用所需的@Before方法,另一个没有.

封闭式

@RunWith(Enclosed.class)
public class Outer{

    public static class Inner1{

     @Before public void setup(){}

     @Test public void test1(){}
    }

  public static class Inner2{

   // include or not the setup
   @Before public void setup2(){}

   @Test public void test2(){}
  }

}
Run Code Online (Sandbox Code Playgroud)


Ale*_*exR 10

不幸的是你必须编写这个逻辑.JUnit没有这样的功能.通常你有2个解决方案:

  1. 只需将测试用例分为两个测试用例:一个包含需要"之前"运行的测试,另一个包含不需要此测试的测试.
  2. 实现您自己的测试运行并注释您的测试以使用它.创建自己的注释@RequiresBefore并使用此注释标记需要此项的测试.测试运行器将解析注释并决定是否运行"before"方法.

第二种解决方案更清晰.第一个更简单.这取决于您选择其中一个.


igo*_*-so 8

这个问题很早以前就有人问过,不过我想分享一下我的解决方案:

  1. 注释所需的方法@Tag("skipBeforeEach")

  2. 在你的 setup() 方法中:

    @BeforeEach
    void setup(final TestInfo info) {
    final Set<String> testTags = info.getTags();
    if(testTags.stream()
               .filter(tag->tag.equals("skipBeforeEach"))
               .findFirst()
               .isPresent()){
    return;
    }
    // do your stuff
    }```
    
    
    Run Code Online (Sandbox Code Playgroud)

  • findFirst 和 isPresent 不使用过滤器,而是简单地使用 anyMatch,否则是不错的解决方案 (3认同)