【问题标题】:Maven Tests Does Not Run Cucumber Scenarios with Spring Boot 2.2 and JUnit 5Maven 测试不使用 Spring Boot 2.2 和 JUnit 5 运行 Cucumber 场景
【发布时间】:2020-07-13 20:37:18
【问题描述】:

我正在 Spring Boot 2.2.6 上尝试 JUnit 5 和 Cucumber,并且在我的应用程序中需要 BDD 场景和单元测试。我已经创建了一个虚拟 ping 控制器对应的功能文件,可以。

运行 mvn clean test 时不会调用 Cucumber 测试。仅调用 JUnit 测试。但是,当单击CucumberTest.java 的Run Test 按钮时,我可以从 Intellij GUI 运行 Cucumber 场景。

这是我的课程:

DummyApplicationTests.java:

package com.a.dummy;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@ActiveProfiles("test")
public class DummyApplicationTests {

    @Test
    public void contextLoads() {
    }

}

CucumberTest.java:

package com.a.dummy.bdd;

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources/features")
public class CucumberTest {
}

CucumberSpringContextConfiguration.java:

package com.a.dummy.bdd;

import com.a.dummy.DummyApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@ContextConfiguration(classes = DummyApplication.class)
public abstract class CucumberSpringContextConfiguration {

}

PingTest.java:

package com.a.dummy.bdd.steps;

import com.a.dummy.bdd.CucumberSpringContextConfiguration;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

public class PingTest extends CucumberSpringContextConfiguration {

    @When("^the client calls /ping")
    public void the_client_issues_GET_ping() {
        ...
    }

    @Then("^the client receives status code of (\\d+)$")
    public void the_client_receives_status_code_of(int statusCode) {
        ...
    }

    @And("^the client receives ping response")
    public void the_client_receives_ping_response_body() {
       ...
    }
}

我错过了什么?

【问题讨论】:

  • 听起来你不知何故错过了junit-vintage。是否仍然执行常规的 JUnit 4 测试?
  • 您还在 DummyApplicationTests 中混合了 JUnit 4 和 JUnit 5
  • 我排除了年份如下:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>我没有 JUnit 4 测试。仅执行 JUnit 5 测试。你能详细说明什么是混合的吗?
  • 我删除了@RunWith(SpringRunner.class),但还是一样。
  • 似乎没有集成 JUnit 5 支持,我不得不包括 junit-vintege。 RunWith 是一个 Junit 4 注释。

标签: java spring spring-boot cucumber junit5


【解决方案1】:

JUnit 5 支持尚未集成,我必须包含 junit-vintage,因为 RunWith 是一个 Junit 4 注释。

【讨论】:

    【解决方案2】:

    我对 Spring boot 2.4.0 也有同样的问题,因为它只支持 JUnit 5,而且 Cucumber 似乎只与 JUnit 4 (RunWith) 集成。回到 Spring boot 2.3.6(向后兼容 JUnit 4)解决了这个问题。

    https://docs.spring.io/spring-boot/docs/2.3.6.RELEASE/reference/html/spring-boot-features.html#boot-features-testing

    26.1。测试范围依赖关系 spring-boot-starter-test “Starter”(在测试范围内)包含以下提供的库:

    JUnit 5(包括用于向后兼容的老式引擎) JUnit 4):单元测试 Java 应用程序的事实标准。

    【讨论】:

    • 另一个选项是添加“junit-vintage-engine”依赖。来自文档:“如果您有使用 JUnit 4 的测试,则可以使用 JUnit 5 的老式引擎来运行它们。要使用老式引擎,请添加对 junit-vintage-engine 的依赖。”链接:docs.spring.io/spring-boot/docs/2.4.0/reference/htmlsingle/…
    【解决方案3】:

    如果你刚刚升级到 Spring 2.4.0 并且 maven 没有运行你的集成测试,那是因为:

    Cucumber 基于 JUnit 4。如果您使用的是 JUnit 5,请记住 还包括 junit-vintage-engine 依赖项。更多 信息,请参阅 JUnit 5 文档。
    Cucumber documentation

    来自Spring Boot 2.4.0 reference,您可以按如下方式修复它:

    如果您有使用 JUnit 4 的测试,则可以使用 JUnit 5 的老式引擎 用来运行它们。要使用老式引擎,请添加对 junit-vintage-engine,如下例所示:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.hamcrest</groupId>
                <artifactId>hamcrest-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    【讨论】:

      【解决方案4】:

      2021 年的答案可能是添加

      <dependency>
        <groupId>io.cucumber</groupId>
          <artifactId>cucumber-junit-platform-engine</artifactId>
        <version>${cucumber.version}</version>
      </dependency>
      

      到您的 pom.xml 文件,因为这允许 Cucumber 与 Junit 5 一起使用。有关更多想法,另请参阅 https://github.com/cucumber/cucumber-jvm/blob/main/junit-platform-engine/README.md。

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 2019-04-16
        • 2020-12-27
        • 2021-09-05
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2019-02-19
        相关资源
        最近更新 更多