JUnit 5 @Tag无法与@ BeforeEach / @ AfterEach一起使用

时间:2019-10-11 10:51:15

标签: java maven junit

拥有一个使用JUnit 5开发的简单数学运算测试套件。 我使用两个标签@Tag("add")@Tag("minus")

使用maven和surefire插件,我为测试选择标签。

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M3</version>
  <configuration combine.children="append">
    <excludedGroups></excludedGroups>
    <groups>add</groups>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.5.2</version>
    </dependency>
  </dependencies>
</plugin>

当我在终端上执行mvn test时,它将仅执行由@Tag("add")标记的测试,但是由于某种原因,将执行仅标记为@BeforeEach@AfterEach的测试。 @Tag("minus")

@Tag("minus")
@BeforeEach
void beforeEach(TestInfo test) { /* code */ }

@Tag("minus")
@AfterEach
void afterEach(TestInfo test) { /* code */ }

由于预期的行为不起作用,我什至用<excludedGroups>强制将<excludedGroups>minus</excludedGroups>上的空值更改为pom.xml,但仍然不起作用。

pom.xml上有什么地方不对?

@Tag@BeforeEach加上@AfterEach之间的冲突?

2 个答案:

答案 0 :(得分:3)

@Tag用于测试类和方法。与上述测试的设置/删除无关。

您可以将这些测试分为单独的测试类,也可以利用Nested Test。嵌套测试可能看起来像这样:

@DisplayName("A stack")
class MathTest {

    @Nested
    @DisplayName("when new")
    @Tag("add")
    class Add {

        @BeforeEach
        void setupAdding() {
            // ...
        }

        @Test
        @DisplayName("can add")
        void canAdd() {
            // ...
        }

    }

    @Nested
    @DisplayName("minus")
    @Tag("minus")
    class Minus {

        @BeforeEach
        void setupMinus() {
            // ...
        }

        @Test
        @DisplayName("can subtract")
        void testMinus() {
            // ...
        }

    }
}

答案 1 :(得分:2)

我认为@Tag注释只是为了遵循一个共同特征来简化测试。如果您需要不同的setUp()和teardown(),我想最好的方法是将它们分开在不同的测试类中,而不是使用标签注释。

在文档中描述了它可以在测试类或测试方法中使用:

https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Tag.html