未解决的参考:SpringExtension 使用 @ExtendWith 注释
Posted
技术标签:
【中文标题】未解决的参考:SpringExtension 使用 @ExtendWith 注释【英文标题】:Unresolved reference: SpringExtension using @ExtendWith annotation 【发布时间】:2018-04-29 04:26:58 【问题描述】:我正在尝试在 SpringBoot 中使用 Junit 5,以便利用它提供的许多新功能。基本设置有效,我可以使用新的注释,例如 @BeforeAll
和 @AfterAll
但是,我相信因为我无法解析 @ExtendWith(SpringExtension::class)
我无法初始化我的测试类以利用注入的资源。我尝试将所需的依赖项添加到我的 build.gradle
文件中,但我认为我缺少一个关键依赖项:
buildscript
ext.dokka_version = '0.9.15'
ext.dockerVersion = '1.2'
ext.junit4Version = '4.12'
ext.junitVintageVersion = '4.12.2'
ext.junitPlatformVersion = '1.0.2'
ext.junitJupiterVersion = '5.0.2'
ext.kotlin_version = '1.1.60'
ext.log4jVersion = '2.9.0'
ext.springVersion = '1.5.8.RELEASE'
repositories
mavenCentral()
jcenter()
dependencies
// Needed for the 'kotlin' plugin
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
// Needed for the 'org.springframework.boot' plugin
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springVersion")
// Needed for the 'kotlin-spring' plugin
classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
//Needed for 'docker' plugin
classpath("se.transmode.gradle:gradle-docker:$dockerVersion")
//Needed for 'dokka' plugin
classpath("org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version")
// Needed for Junit 5
classpath("org.junit.platform:junit-platform-gradle-plugin:$junitPlatformVersion")
// Allows us to compile Kotlin files
apply plugin: 'kotlin'
// Does some extra work to set up Spring Boot.
// Specifically this gives us the "bootRun" task we will be using
apply plugin: 'org.springframework.boot'
// Allows for improved interoperability between Kotlin and Spring
apply plugin: 'kotlin-spring'
// Allows us to create docker image
apply plugin: 'docker'
//Allows us to create API documentation
apply plugin: 'org.jetbrains.dokka'
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'org.junit.platform.gradle.plugin'
junitPlatform
// platformVersion '1.0.2'
filters
engines
// include 'junit-jupiter', 'junit-vintage'
// exclude 'custom-engine'
tags
// include 'fast'
exclude 'slow'
// includeClassNamePattern '.*Test'
// enableStandardTestTask true
// reportsDir file('build/test-results/junit-platform') // this is the default
//logManager 'org.apache.logging.log4j.jul.LogManager'
task buildDocker(type: Docker, dependsOn: [build, dokka])
applicationName = jar.baseName
dockerfile = file('Dockerfile')
doFirst
copy
from jar
into stageDir
dokka
outputFormat = 'html'
outputDirectory = $buildDir / doc
repositories
mavenCentral()
compileJava
sourceCompatibility = 1.8
targetCompatibility = 1.8
compileTestJava
sourceCompatibility = 1.8
targetCompatibility = 1.8
options.compilerArgs += '-parameters'
dependencies
// JPA and H2
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("com.h2database:h2")
compile "org.hibernate:hibernate-entitymanager:5.2.10.Final"
compile "org.hibernate:hibernate-core:5.2.10.Final"
compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
compile "org.slf4j:slf4j-api:1.7.25"
// Kotlin Dependencies
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
testCompile "org.springframework.boot:spring-boot-starter-test"
//testCompile "org.springframework.boot:spring-boot-starter-test"
// exclude(module = "junit")
//
// Mockito
//testCompile "org.mockito:mockito-core:2.11.0"
//testCompile "com.nhaarman:mockito-kotlin-kt1.1:1.5.0"
//AssertJ
testCompile 'org.assertj:assertj-core:3.8.0'
// JUnit Jupiter API and TestEngine implementation
testCompile("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
testCompile("org.junit.platform:juint-platform-runner:$junitPlatformVersion")
testRuntime("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
// Only needed to run tests in an (IntelliJ) IDE(A) that bundles an older version
testRuntime("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
// If you also want to support JUnit 3 and JUnit 4 tests
//testCompile ("junit:junit:$junit4Version")
//testRuntime ("org.junit.vintage:junit-vintage-engine:$junitVintageVersion")
// To avoid compiler warnings about @API annotations in JUnit code
testCompileOnly("org.apiguardian:apiguardian-api:1.0.0")
// Spring Dependencies
compile("org.springframework.boot:spring-boot-starter-web")
exclude module: "spring-boot-starter-tomcat"
compile "org.springframework.boot:spring-boot-starter-jetty"
compile "org.springframework.boot:spring-boot-starter-actuator"
// Jackson Dependencies
compile "com.fasterxml.jackson.core:jackson-annotations"
compile "com.fasterxml.jackson.core:jackson-core"
compile "com.fasterxml.jackson.core:jackson-databind"
runtime "com.fasterxml.jackson.datatype:jackson-datatype-jdk8"
runtime "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
runtime "com.fasterxml.jackson.module:jackson-module-kotlin"
configurations.all
exclude group: "org.slf4j", module: "slf4j-log4j12"
exclude group: "log4j", module: "log4j"
task wrapper(type: Wrapper)
gradleVersion = "4.3"
【问题讨论】:
【参考方案1】:我没有在 build.gradle
的任何地方看到声明的 spring-test-junit5
依赖项。根据docs for the JUnit 5 Spring extension:
如果您想针对 spring-test-junit5 的发布标签进行构建,您可能对使用 JitPack 感兴趣。例如,要针对 1.0.2 标记进行构建,以下 Maven 坐标将起作用。
Group ID: com.github.sbrannen
Artifact ID: spring-test-junit5
Version: 1.0.2
带有 Gradle 的 JitPack
repositories
mavenCentral()
maven url 'https://jitpack.io'
// ...
dependencies
// ...
testCompile('com.github.sbrannen:spring-test-junit5:1.0.2')
// ...
更新:
摘自以下cmets(JUnit5 Spring Extension作者提供):
如果您使用 Spring Framework 5.x 中的 spring-test,则不需要 spring-test-junit5 工件(仅适用于 Spring Framework 4.3.x)
【讨论】:
谢谢,我错过了这些依赖项。不幸的是,我现在收到以下错误:FAILURE: Build failed with an exception。 * 出了什么问题:任务 ':spog-api:compileTestKotlin' 执行失败。无法解析配置 ':spog-api:testCompileClasspath' 的所有文件。 > 找不到 com.github.sbrannen:spring-test-junit5:1.0.2。要求:项目:spog-api 那条消息不是告诉你 spring-test-junit 依赖仍然缺失吗?或者至少它在 testCompileClasspath 上不可用?也许你没有正确地将它添加到 build.gradle 中? 作者 sbrannen 提到他的工作“已与 SPR-13575 一起并入 Spring Framework 5.0”。所以我认为我不需要这个原型项目的依赖。我去看看是否需要spring framework 5的依赖。 添加 sbrannen 和 jitpack 依赖项后,我没有看到来自 Gradle 的任何消息说它已经下载了人工制品。所以是的,这可以解释错误。 如果您使用 Spring Framework 5.x 中的spring-test
,您确实不需要需要 spring-test-junit5
工件(仅适用于 Spring Framework 4.3.x)。 【参考方案2】:
我缺少以下依赖项:
dependencies
compile 'org.springframework:spring-context:5.0.1.RELEASE'
最终由于我的 build.gradle 导致了很多依赖项不匹配。确保所有 spring 模块都来自 5.0.1.RELEASE 我从以前的版本中发现了一些导致不同错误的模块。我最终定义了我的版本:
ext
antJunitVersion = '1.9.7'
assertjcoreVersion = '3.8.0'
apiguardianVersion = '1.0.0'
dokkaVersion = '0.9.15'
dockerVersion = '1.2'
h2Version = '1.4.196'
hibernateVersion = '5.2.12.Final'
jacksonVersion = '2.9.1'
junit4Version = '4.12'
junitVintageVersion = '4.12.2'
junitPlatformVersion = '1.0.2'
junitJupiterVersion = '5.0.2'
kotlinVersion = '1.1.60'
log4jVersion = '2.9.1'
springVersion = '5.0.1.RELEASE'
springBootVersion = '1.5.8.RELEASE'
slf4jVersion = '1.7.25'
然后将它们声明为显式依赖项
// Spring Dependencies
compile("org.springframework:spring-webmvc:$springVersion")
compile("org.springframework:spring-web:$springVersion")
compile("org.springframework:spring-aspects:$springVersion")
compile("org.springframework:spring-aop:$springVersion")
compile("org.springframework:spring-orm:$springVersion")
compile("org.springframework:spring-jdbc:$springVersion")
compile("org.springframework:spring-tx:$springVersion")
compile("org.springframework:spring-beans:$springVersion")
compile("org.springframework:spring-expression:$springVersion")
compile("org.springframework:spring-core:$springVersion")
compile("org.springframework:spring-context:$springVersion")
compile("org.springframework:spring-test:$springVersion")
compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion")
exclude module: "spring-boot-starter-tomcat"
compile "org.springframework.boot:spring-boot-starter-jetty:$springBootVersion"
compile "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
【讨论】:
以上是关于未解决的参考:SpringExtension 使用 @ExtendWith 注释的主要内容,如果未能解决你的问题,请参考以下文章
@ExtendWith(SpringExtension.class) 不工作
无法在使用 @ExtendWith(SpringExtension.class) 运行的 Spring Boot 单元测试中注入应用程序上下文
@ExtendWith(SpringExtension.class) 和 @ExtendWith(MockitoExtension.class) 有啥区别?
如何修复类型不匹配:@ExtendWith(SpringExtension::class) Class -> Class in intellij?