【问题标题】:Run Junit @Test that ignores @Before/@After运行忽略 @Before/@After 的 Junit @Test
【发布时间】:2026-01-06 03:55:01
【问题描述】:

是否可以在具有使用@Before 注释的方法的类中运行JUnit @Test 方法,但仅在此测试中忽略@Before 方法?

编辑:我对 JUnit 是否支持此功能感兴趣,而不是解决方法。我知道一些变通方法,例如在另一个类中移动测试或删除注释并在每个测试方法中手动调用 setUp()

假设在一个类中有 30 个测试,其中 29 个 @Before 确实简化了测试初始化​​,但其中一个(或多个)是无用的/它使事情复杂化。

public class MyTestClass {

    @Before
    public void setUp() {
        //setup logic
    }

    @Test
    public void test1() {
        //[...]
    }

    @Test
    public void test2() {
        //[...]
    }

    //more tests here

    @Test(ignoreBefore = true, ignoreAfter = true //false by default)
    //something equivalent to this
    public void test20() {
        //[...]
    }

}

【问题讨论】:

  • 你可以在没有@Before@After 注释的情况下将test20 移动到单独的类中吗?
  • @user1516873 技术上是的,但我想将一个类的所有测试保留在一个测试类中。在设计/开发课程时,没有考虑测试,重构也不是解决方案。此外,单元测试的定义表明它们是独立的,可以单独运行。

标签: java unit-testing junit


【解决方案1】:

您可以使用 TestRule 执行此操作。请参阅我对Exclude individual test from 'before' method in JUnit 的回答。基本上,实现ExternalResource,在apply方法中,检查方法上是否有特定的注解,如果有,不要运行before/after方法。不过,您必须从规则中专门调用之前/之后。

【讨论】:

    【解决方案2】:

    如果它没用,那应该不是问题 - 再次运行设置是否有害?

    但是我不认为这是可能的,并认为我是一个残废的功能。

    另一种方法 - 将该测试移至单独的测试类。

    【讨论】:

    • +1 我肯定会在单独的测试类方面犯错。显然,其他测试有相似之处,需要将它们组合在一起。你的奇数一出测试没有。
    • 我真的很好奇 JUnit 是否提供此功能,而不是解决方法。为什么它看起来像一个残废功能?在单元测试的基本定义中,单元测试应该完全独立于彼此的想法不是吗?其他测试不应该关心他们中的一些是否调用 @Before 方法而其他测试不。
    • @m3th0dman 这不是测试之间的依赖关系,而是来自测试上下文的依赖关系。测试放置在具有 setUp 方法的类中。那为什么不执行呢?看起来非常令人惊讶。软件开发中的意外令人不快。
    • @kan 假设您有一个不是为测试而设计的类,不允许重构,并且您希望将生产类的所有测试保留在单个测试类中。无论如何,我想在 JUnit 中找到一种解决方法,而且我已经看到了。
    【解决方案3】:

    在 JUnit 5 中,您可以使用 @Nested 注解进行嵌套测试:

    public class MainClass {
     @Nested
      class InnerClass1 {
    
      @BeforeEach 
      void setup(){}
    
      @Test 
      void test1(){}
     }
    
     @Nested
      class InnerClass2 {
      // No setup
    
      @Test 
      void test2(){}
     }
    } 
    

    【讨论】:

      【解决方案4】:

      补充一点,这是我最近访问该地区时发现的。

      Junit/Mockito 似乎优先考虑在测试中定义的模拟行为,而不是 @Before 注释方法。

      【讨论】:

        最近更新 更多