Reputation: 2429
Overall:
I'm trying to run gradle build task for a specific spring profile but I've got an error in passing following test:
au.com.mnpd.security.JwtTokenUtilTest > generateToken_succeeds FAILED
java.lang.IllegalStateException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.BeanCreationException
Caused by: java.lang.IllegalArgumentException
The test is using some properties from spring development profile (located in application-development.yaml). But I couldn't find any way to pass active profile to gradle build command. I tried followings but again the same issue:
- gradlew -Dspring.profiles.active=development build
- gradlew -Pdevelopment build
Question:
Is there anyway to pass active profile to gradle (v 4.7) build task like what is applicable for bootRun task as follows:
bootRun {
bootRun.systemProperty 'spring.profiles.active', 'development'
}
Note: I tried the same for build but build.systemProperty method does not exist for build task.
As I'm new in gradle, I'd be grateful is you could share your genuine solutions with me.
Upvotes: 11
Views: 30034
Reputation: 106
in build.gradle:
task 'testCi' (type: Test) {
useJUnit()
jvmArgs "-Dspring.profiles.active=ci"
}
task 'testLocal' (type: Test) {
useJUnit()
jvmArgs "-Dspring.profiles.active=local"
}
I've just been bitten by the way Gradle handle this using Gradle 6.x, I have two separate test tasks in which I want to run the same tests with either a local or CI configuration.
Tests use Junit platform, for which Gradle spawns a new JVM. As far as I can tell systemProperties is not passed down to the JVM running tests, but jvmArgs will specifically pass properties to the test JVM.
Using env vars as Eugene suggests also works as the child JVM normally inherits env from its parent.
Upvotes: 1
Reputation: 2711
Gradle files should not depend on your spring profile, unless you explicitly wish that thing.
To run your app with specific profile, use :
SPRING_PROFILES_ACTIVE=myprofile ./gradlew bootRun
Upvotes: 5
Reputation: 165
If you using gradle boot run you need to add this to your build.gradle file
bootRun {
String activeProfile = System.properties['spring.profiles.active']
systemProperty "spring.profiles.active", activeProfile
}
and then at the time of building you can use gradle bootRun -Dspring.profiles.active=test
or to build you can use gradle build -Dspring.profiles.active=test
Upvotes: 5
Reputation: 14510
What you are looking for is setting system properties on the Test
task, which is what will run your unit tests:
test {
systemProperty 'spring.profiles.active', 'development'
}
Edited after comment - leaving the original answer below as it may still be useful.
Gradle does not know the way bootRun
exposes its system properties.
You thus have to add a configuration in your build script, to expose what you need to the Gradle command line.
Something like:
bootRun {
bootRun.systemProperty 'spring.profiles.active', "${springProfile}"
}
and then have a default in gradle.properties
:
springProfile = development
and possibly override the value on the command line:
./gradlew -PspringProfile=test build
Upvotes: 16