Java 如何使用JUnit扩展将@beforeach与@Test方法链接?

Java 如何使用JUnit扩展将@beforeach与@Test方法链接?,java,unit-testing,junit,automated-tests,junit5,Java,Unit Testing,Junit,Automated Tests,Junit5,例如,我们有两个类:BaseTest和Test测试扩展BaseTest BaseTest.class包含两个方法,每个方法前面都有@注释 @BeforeEach void setUp1() {} @BeforeEach void setUp2() {} @Test void test1() {} @Test void test2() {} Test.class包含两个带有@Test注释的方法 @BeforeEach void setUp1() {} @BeforeEach

例如,我们有两个类:
BaseTest
Test
<代码>测试扩展
BaseTest

BaseTest.class
包含两个方法,每个方法前面都有
@注释

@BeforeEach
  void setUp1() {}

@BeforeEach
  void setUp2() {}
@Test
void test1() {}

@Test
void test2() {}
Test.class
包含两个带有
@Test
注释的方法

@BeforeEach
  void setUp1() {}

@BeforeEach
  void setUp2() {}
@Test
void test1() {}

@Test
void test2() {}
我想将
@beforeach
方法与
@Test
方法链接起来,这样
setup1()
只会在
test1()
之前运行,而
setup2()
只会在
test2()
之前运行


我希望使用JUnit扩展完成此任务的代码示例。

这是不可能的。您还可以考虑其他一些选择:

  • 将setup2()和test2()放在另一个测试类中。因为test1和test2不共享设置(“fixture”),所以它们应该在不同的类中
  • 删除@beforeach注释,并在实际测试方法开始时显式调用setup方法

每个
之前的
@中的操作词是每个。这些方法在每个测试之前运行,并不真正适合您所描述的用例。如果您需要如此紧密的耦合,我建议您远离JUnit注释,直接调用设置方法:

public class BaseTest {
    void setUp1() {}

    void setUp2() {}
}

public class Test extends BaseTest {
    @Test
    void test1() {
        setUp1();
        // test logic
    }

    @Test
    void test2() {
        setUp2();
        // test logic
    }
}

在JUnit5中,您有一个称为嵌套测试的新特性,它允许您拥有嵌套类,每个类在前后都有自己的类。这需要对您的类层次结构
BaseTest.class
Test.class
进行一点更改,但效果非常好:

@嵌套表示带注释的类是非静态嵌套测试 班级@BeforeAll和@AfterAll方法不能直接用于 @嵌套测试类,除非“每类”测试实例生命周期为 用过。这样的注释不会被继承


您不需要将测试设置代码仅放在每个带注释的方法之前的
@beforeach
中。您可以将它放在
@Test
方法中,或者(也许更好)放在从
@Test
方法调用的方法中。

这实际上是个好主意。只是要小心,因为嵌套测试很快就会变得混乱。