Spring Boot 和 JUnit 5 之间的交互——必须使用整体工件而不是个人?

Interaction between Spring Boot and JUnit 5 -- must use the overall artifacts not the individuals?

之前有人问过这个问题(例如),但我的观察与之前报道的不一样。

我注意到要使 JUnit 5 正常工作,我必须包括整个 JUnit 5 工件

testImplementation('org.junit.jupiter:junit-jupiter:5.5.1')

如果我改为包含单个工件,那么 JUnit 测试将不会被选取

testImplementation('org.junit.platform:junit-platform-runner:1.3.1')
testImplementation('org.junit.platform:junit-platform-launcher:1.0.0')
testImplementation('org.junit.jupiter:junit-jupiter-engine:5.5.1')
testImplementation('org.junit.jupiter:junit-jupiter-api:5.5.1')
testImplementation('org.junit.jupiter:junit-jupiter-params:5.5.1')
testImplementation('org.junit.vintage:junit-vintage-engine:5.5.1')

有没有人见过类似的东西?

(我也用非 Spring-Boot 项目尝试过这个——在那种情况下,可以包含单独的工件。这造成了很多混乱。)

这里我用gradle显示结果,但我用maven也有类似的结果。

我正在使用 Gradle 5.4.1Spring Boot 2.1.7.RELEASEJUnit 5.5.1

我包括完整的 build.gradle 和下面的测试 class

build.gradle

plugins {
    id 'org.springframework.boot' version '2.1.7.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    testImplementation('org.junit.jupiter:junit-jupiter:5.5.1')

//  testImplementation('org.junit.platform:junit-platform-runner:1.3.1')
//  testImplementation('org.junit.platform:junit-platform-launcher:1.0.0')
//  testImplementation('org.junit.jupiter:junit-jupiter-engine:5.5.1')
//  testImplementation('org.junit.jupiter:junit-jupiter-api:5.5.1')
//  testImplementation('org.junit.jupiter:junit-jupiter-params:5.5.1')
//  testImplementation('org.junit.vintage:junit-vintage-engine:5.5.1')

}

test {
    useJUnitPlatform()
}

DemoApplicationTest.java

package com.example.demo;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class DemoApplicationTests {

    @Test
    public void failMe() {
        Assertions.assertTrue(Boolean.FALSE);
    }

}

请注意,在这种情况下,我期望在测试方法中抛出一个异常 failMe() —— 以证明测试方法已被运行器拾取并且没有被默默地忽略。

感谢@johanneslink 的提示(在开场问题的评论中),现在我想我对问题有了更好的理解:

还是用聚合神器比较好

testImplementation('org.junit.jupiter:junit-jupiter:5.5.1')

如果您真的想使用各个工件,请确保它们的版本兼容

这个组合可行

testImplementation('org.junit.platform:junit-platform-launcher:1.5.1')
testImplementation('org.junit.jupiter:junit-jupiter-engine:5.5.1')
testImplementation('org.junit.jupiter:junit-jupiter-api:5.5.1')

但不是这个

testImplementation('org.junit.platform:junit-platform-launcher:1.3.1')
testImplementation('org.junit.jupiter:junit-jupiter-engine:5.5.1')
testImplementation('org.junit.jupiter:junit-jupiter-api:5.5.1')

(其他三个工件不相关,所以我在这里省略它们。例如,根据 JUnit 5 User Guide

junit-platform-runner

Runner for executing tests and test suites on the JUnit Platform in a JUnit 4 environment.

与此处无关。)