繁体   English   中英

JUnit:@Before 仅适用于某些测试方法?

[英]JUnit: @Before only for some test methods?

我有一些常见的设置代码,我已将其分解为标有@Before的方法。 但是,不必为每个测试都运行所有这些代码。 有没有办法标记它,以便@Before方法只在某些测试之前运行?

只需将不需要安装代码的测试移到单独的测试类中即可。 如果您有一些测试通用的其他代码,可以帮助保留这些代码,请将其移到帮助程序类中。

或使用TestNG 它使您可以更好地控制测试。

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

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

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

检查主题以获取有关@Rule更多见解。

不确定@Before,但是最近我想出了一个策略,可以有选择地运行@After块。 实施是直接的。 我将一些标志设置为默认值,作为测试类的一部分。 它们被重置为@Before类中的默认值。 在该类中,我需要做特定于标志的事情,我在@标志中设置了这些标志并检查了标志值以完成各自的工作。

@嵌套+ @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中这样做

JUnit 4.12 提供 Enclosed Runner 之类的

@RunWith(Enclosed.class) 
public class GlobalTest{

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM