Reputation: 174
I'm using trying to use Junit 5 within SpringBoot in order to take advantage of a number of new features that it provides. The basic setup works and I can use the new annotations such as @BeforeAll
and @AfterAll
however, I believe that because I cannot resolve the @ExtendWith(SpringExtension::class)
I am not able to initialise my Test class to make use of injected resources. I have tried adding required dependencies to my build.gradle
file but I assume I'm missing a key dependency:
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"
}
Upvotes: 0
Views: 6371
Reputation: 47935
I don't see the spring-test-junit5
dependency declared anywhere in your build.gradle
. According to the docs for the JUnit 5 Spring extension:
If you'd like to build against a release tag for spring-test-junit5, you may be interested in using JitPack. For example, to build against the 1.0.2 tag, the following Maven coordinates will work.
Group ID: com.github.sbrannen
Artifact ID: spring-test-junit5
Version: 1.0.2
JitPack with Gradle
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
// ...
dependencies {
// ...
testCompile('com.github.sbrannen:spring-test-junit5:1.0.2')
// ...
}
Update:
Extracted from the comments below (provided by the author of the JUnit5 Spring Extension):
If you are using spring-test from Spring Framework 5.x, you do not need the spring-test-junit5 artifact (which is only for Spring Framework 4.3.x)
Upvotes: 1
Reputation: 174
I was missing the following dependency:
dependencies {
compile 'org.springframework:spring-context:5.0.1.RELEASE'
}
Ultimately there were a lot of dependency mismatches due to my build.gradle. Make sure all spring modules are derived from the 5.0.1.RELEASE I found some from previous versions which caused different errors. I ended up defining my versions:
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'
}
and then declared them as explicit dependencies
// 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}"
Upvotes: 1