Java 是否可以参数化@beforeach,即根据每个@Test给定的参数调用不同的@beforeach?

Java 是否可以参数化@beforeach,即根据每个@Test给定的参数调用不同的@beforeach?,java,annotations,junit5,parametrized-testing,Java,Annotations,Junit5,Parametrized Testing,我正在尝试编写一个需要使用特定设置的测试类。当只有1个设置时,使用@beforeach即可轻松实现: @BeforeEach public void setup() { // my setup code } @Test public void test1() { // ... } @Test public void test2() { // ... } @Test public void test3() { // ... } 但是,当有几个设置可供选择时,我该怎么办?当然

我正在尝试编写一个需要使用特定设置的测试类。当只有1个设置时,使用@beforeach即可轻松实现:

@BeforeEach public void setup() {
  // my setup code
}

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

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

@Test public void test3() {
  // ...
}
但是,当有几个设置可供选择时,我该怎么办?当然,我可以完全忘记@beforeach,让同事调用他们想要使用的设置方法:

@Test public void test1() {
  setupA();
  // ...
}

@Test public void test2() {
  setupB();
  // ...
}

@Test public void test3() {
  setupB();
  // ...
}
但这不再强制使用我的一种设置方法。有没有办法实现“参数化的@beforeach”?类似(由语法组成):

或者更好,将其烘焙到@Test注释中

@TestWithSetupA public void test1() {
  // ...
}

@TestWithSetupB public void test2() {
public void test2() {
  // ...
}

@TestWithSetupB public void test3() {
public void test3() {
  // ...
}

是的,这确实很简单。您可以使用test annotation标记,并在每次设置之前注入TestInfo对象,但您需要JUnit 5

这是一个正在工作的JUnit

public class TestBeforeEach {

@BeforeEach
public void setUp(TestInfo testInfo) {
    System.out.println(testInfo.getTags());
}

@Test
@Tag( "setup1" )
public void test1() {

}

@Test
@Tag( "setup2" )
public void test2() {

}

希望这有帮助。干杯

这些不只是属于不同测试类的不同测试吗?@M.Deinum-我考虑过,但似乎有点奇怪,例如,假设我添加了一些新功能,我想在一个用户、两个用户、两个用户的情况下为该功能编写测试,其中一个用户的访问受到限制,等等。我觉得测试是非常密切相关的,我希望能够比较断言的变化,而不必查看文件。我个人更喜欢显式调用,而不是使用@beforeach,然后在测试方法中进行设置。为什么要试图通过滥用
@之前的
@将其硬塞进测试框架?或者创建一个包含设置的外部夹具,并从您的测试方法中调用它,这样您也可以在其他测试类中重用它。@M.Deinum-好吧,我想我正试图找到一个技术解决方案来帮助我解决一个人类问题。由于需求和必要性,我们被迫允许外部人员对我拥有的系统进行贡献,并允许这些贡献者自主,因为只有我一个人无法以继续业务所需的速度跟上每一个PR。这些贡献者在我的系统中缺乏经验/知识,他们想方设法实现最低限度(但通常不正确)的设置,以便编写他们的测试。我想强制beforeach,这样它们就不能绕过我的设置(很容易)。@annotation不能有枚举参数,纯字符串是
@Tag
的唯一选项(尽管您使用
公共静态final
常量来保持它)我喜欢这个解决方案,但想补充一点,您可以创建一个元注释
@TestWithSetupA
,它同时应用
@Test
@Tag(“SetupA”)
。看见
public class TestBeforeEach {

@BeforeEach
public void setUp(TestInfo testInfo) {
    System.out.println(testInfo.getTags());
}

@Test
@Tag( "setup1" )
public void test1() {

}

@Test
@Tag( "setup2" )
public void test2() {

}