JUnit:@Before只针对一些测试方法?

时间:2009-10-10 16:53:01

标签: java unit-testing junit

我有一些常见的设置代码,我已将其考虑在标有@Before的方法中。但是,并非所有这些代码都必须针对每个测试运行。有没有办法对其进行标记,以便@Before方法仅在某些测试之前运行?

6 个答案:

答案 0 :(得分:32)

将不需要设置代码的测试移出到单独的测试类中。如果你有一些其他常用的测试代码有助于保持,那就把它移到一个帮助类中。

答案 1 :(得分:3)

或使用TestNG。它为您提供了更精细的测试控制。

答案 2 :(得分:2)

也可以通过JUnit中的Assume来实现。然后,您可以检查要处理的方法名称@Before

public class MyTest {
     @Rule
     public TestName testName = new TestName();

     @Before
     public void setUp() {
       assumeTrue(testName.getMethodName().equals("myMethodName"));
       // setup follows
     }
}

查看topic以获取有关@Rule的更多见解。

答案 3 :(得分:1)

@嵌套+ @ForEach

完全同意将相关代码移至内部类的观点。所以这就是我所做的。

  1. 在测试类中创建内部类
  2. 使用@Nested注释内部类
  3. 在内部类中移动所有要使用的测试方法
  4. 在内部类中编写初始化代码,并使用@ForEach对其进行注释

代码如下:

class Testing {

    @Test
    public void testextmethod1() {

      System.out.println("test ext method 1");

    }

    @Nested
    class TestNest{

       @BeforeEach
       public void init() {
          System.out.println("Init");
       }

       @Test
       public void testmethod1() {
          System.out.println("This is method 1");
       }

       @Test
       public void testmethod2() {
          System.out.println("This is method 2");
       }

       @Test
       public void testmethod3() {
          System.out.println("This is method 3");
       }

     }

     @Test
     public void testextmethod2() {

         System.out.println("test ext method 2");

     }

}

这是输出

test ext method 1
test ext method 2
Init
This is method 1
Init
This is method 2
Init
This is method 3

注意:我不确定Junit4是否支持此功能。我在JUnit5中这样做

答案 4 :(得分:0)

不确定@Before,但我最近提出了一个@After块选择性运行的策略。实施很直接。我有一些标志设置为默认值作为测试类的一部分。它们在@Before类中重置为默认值。在课堂上我需要做一些特定于旗帜的事情,我设置了那些旗帜和放大器。在@After我检查标志值以执行相应的作业。

答案 5 :(得分:0)

JUnit 4.12提供了封闭式Runner

@RunWith(Enclosed.class) 
public class GlobalTest{

    @RunWith(MockitoJUnitRunner.class)
    public class InnerTest{
    
    }

}