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

时间:2012-10-22 18:05:33

标签: java testing junit

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

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

有办法吗?

6 个答案:

答案 0 :(得分:21)

您可以使用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();
    }
  };
}

答案 1 :(得分:16)

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

Enclosed

@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(){}
  }

}

答案 2 :(得分:10)

不幸的是你必须编写这个逻辑代码。 JUnit没有这样的功能。 通常,您有两种解决方案:

  1. 只需将测试用例分为2个测试用例:一个包含需要“之前”运行的测试,另一个包含不需要此测试的测试。
  2. 实施您自己的测试运行并注释您的测试以使用它。创建自己的注释@RequiresBefore并使用此注释标记需要此注释的测试。测试运行器将解析注释并决定是否运行“之前”方法。
  3. 第二种解决方案更清晰。第一个更简单。这取决于你选择其中一个。

答案 3 :(得分:0)

还可以通过撤消在测试用例中@Before设置中所执行的操作来解决此问题。 这就是它的外观,

@Before
public void setup() {
    TestDataSetupClass.setupTestData();
}

@Test
public void testServiceWithIgnoreCommonSetup() {
    TestDataSetupClass.unSet();
    //Perform Test
}

这里的解决方案有利有弊。对此的轻微con,是不必要的设置和取消设置步骤的循环。但是如果只需要为数百个测试用例做这件事就可以了,并避免编写自我AOP或维护多个内部测试类的开销。

答案 4 :(得分:0)

我一直在寻找解决这个问题的方法,然后碰到了这个问题。作为更新,在JUnit 5中,现在可以使用@Nested annotation来轻松实现这一点。

答案 5 :(得分:0)

如果您使用的是Mockito,尤其是Mockito 3.0,则所有存根都将是“严格的”,并且默认情况下会得到验证。

您可以使用Mockito lenient()方法。

更多内容:https://www.baeldung.com/mockito-unnecessary-stubbing-exception#lenient-stubbing