26

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

我需要一个特定的测试来不执行这个之前的方法。

有没有办法做到这一点?

4

8 回答 8

24

您可以使用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();
    }
  };
}
于 2012-10-22T18:27:34.703 回答
20

考虑使用@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(){}
  }

}
于 2012-10-22T18:20:37.260 回答
12

不幸的是,您必须编写此逻辑。JUnit 没有这样的特性。通常你有2个解决方案:

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

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

于 2012-10-22T18:13:24.347 回答
2

这个问题已经被问过一段时间了,不过,我想分享我的解决方案:

  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
    }```
    
    
于 2021-11-03T13:32:13.637 回答
0

@Before也可以通过撤消在测试用例中的设置中所做的事情来解决这个问题。这可能是它的样子,

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

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

这里的解决方案有利有弊。次要缺点是设置和取消设置步骤的不必要循环。但是如果一个人只需要为数百个测试用例做这件事,并且避免编写自己的 AOP 或维护多个内部测试类的开销,那就很好了。

于 2018-01-17T06:29:58.310 回答
0

我一直在寻找这个问题的解决方案并遇到了这个问题。作为更新,在 JUnit 5 中,现在可以使用@Nested 注释轻松完成此操作。

于 2019-08-14T09:36:22.977 回答
0

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

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

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

于 2020-11-24T16:59:43.743 回答
0

如果你有一个@After 方法可以清除@Before 中所做的工作,你可以在@Test 方法的开头手动调用@After 方法。

于 2021-11-29T12:51:03.750 回答