无法从黄瓜测试中读取 application.yml
Unable to read the application.yml from cucumber test
我有一个黄瓜测试:
@RunWith(CucumberWithSerenity.class)
@UsePersistantStepLibraries
@CucumberOptions(
features = "src/integrationTest/resources/features/",
glue = {"com/myorg/proj/integrationtest/stepdefinitions"},
plugin = {"pretty", "summary"}
)
public class integrationTestRunner extends ParentClassWithAllMethods {
}
这个测试没有在测试文件夹中定义,而是作为一个单独的文件夹(作为源集,其他人已经创建了这个结构)。
源集(测试所在)的gradle配置如下:
sourceSets {
integrationTest {
java {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integrationTest/java')
}
resources.srcDir file('src/integrationTest/resources')
}
}
// Dependencies for integrationTest
dependencies {
integrationTestCompileOnly 'org.projectlombok:lombok:1.18.12'
integrationTestAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
integrationTestCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.2'
integrationTestImplementation 'net.serenity-bdd:serenity-core:2.2.13'
integrationTestImplementation 'net.serenity-bdd:serenity-cucumber5:2.2.5'
integrationTestImplementation 'net.serenity-bdd:serenity-rest-assured:2.2.13'
integrationTestImplementation 'org.assertj:assertj-core:3.8.0'
integrationTestImplementation 'org.slf4j:slf4j-simple:1.7.7'
}
task integrationTest(type: Test) {
doFirst {
systemProperty 'param1',
System.getProperty('param1')
param1 = System.getProperty('param1')
if (param1 == null)
throw new GradleException("Parameter not passed ./gradlew -DParam<VALUE> ")
}
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
outputs.upToDateWhen { false }
finalizedBy aggregate
}
查看 gradle 文件,发生了 3 件事,
- 有一个源集定义为
integrationTest
- compileCLassPath、runTimeClassPath、srcDir 已定义相同
- 甚至 resources.srcDir 也被设置(我有应用程序 ymls)
我已经在资源文件夹中创建了 application.yml、application-integrationTest.yml,但仍然无法使用 @Value 读取任何属性。
例如:
public class ParentClassWithAllMethods {
@Value("${custom.parameter}")
private String customParameter;
public ResponseOptions<Response> getMethod() {
String debugVal = customParameter;
}
.....
}
当 运行 测试时,我期望得到我的 yml 文件中定义的值,但它是空的。
YML 文件看起来像这样,
自定义:
参数:https://something.com
为什么我无法读取应用程序配置?它总是空的!!
您的测试 class 没有开始 Spring,这就是您得到 null 的原因。看看这里 https://www.baeldung.com/cucumber-spring-integration,它展示了如何在 JUnit 测试中连接 Spring 和 Cucumber。
然后测试 class 会对 Spring 和 Cucumber 进行注释,如下所示:
@CucumberContextConfiguration
@SpringBootTest
public class SpringIntegrationTest {
// executeGet implementation
}
我有一个黄瓜测试:
@RunWith(CucumberWithSerenity.class)
@UsePersistantStepLibraries
@CucumberOptions(
features = "src/integrationTest/resources/features/",
glue = {"com/myorg/proj/integrationtest/stepdefinitions"},
plugin = {"pretty", "summary"}
)
public class integrationTestRunner extends ParentClassWithAllMethods {
}
这个测试没有在测试文件夹中定义,而是作为一个单独的文件夹(作为源集,其他人已经创建了这个结构)。
源集(测试所在)的gradle配置如下:
sourceSets {
integrationTest {
java {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integrationTest/java')
}
resources.srcDir file('src/integrationTest/resources')
}
}
// Dependencies for integrationTest
dependencies {
integrationTestCompileOnly 'org.projectlombok:lombok:1.18.12'
integrationTestAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
integrationTestCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.2'
integrationTestImplementation 'net.serenity-bdd:serenity-core:2.2.13'
integrationTestImplementation 'net.serenity-bdd:serenity-cucumber5:2.2.5'
integrationTestImplementation 'net.serenity-bdd:serenity-rest-assured:2.2.13'
integrationTestImplementation 'org.assertj:assertj-core:3.8.0'
integrationTestImplementation 'org.slf4j:slf4j-simple:1.7.7'
}
task integrationTest(type: Test) {
doFirst {
systemProperty 'param1',
System.getProperty('param1')
param1 = System.getProperty('param1')
if (param1 == null)
throw new GradleException("Parameter not passed ./gradlew -DParam<VALUE> ")
}
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
outputs.upToDateWhen { false }
finalizedBy aggregate
}
查看 gradle 文件,发生了 3 件事,
- 有一个源集定义为
integrationTest
- compileCLassPath、runTimeClassPath、srcDir 已定义相同
- 甚至 resources.srcDir 也被设置(我有应用程序 ymls)
我已经在资源文件夹中创建了 application.yml、application-integrationTest.yml,但仍然无法使用 @Value 读取任何属性。
例如:
public class ParentClassWithAllMethods {
@Value("${custom.parameter}")
private String customParameter;
public ResponseOptions<Response> getMethod() {
String debugVal = customParameter;
}
.....
}
当 运行 测试时,我期望得到我的 yml 文件中定义的值,但它是空的。
YML 文件看起来像这样,
自定义: 参数:https://something.com
为什么我无法读取应用程序配置?它总是空的!!
您的测试 class 没有开始 Spring,这就是您得到 null 的原因。看看这里 https://www.baeldung.com/cucumber-spring-integration,它展示了如何在 JUnit 测试中连接 Spring 和 Cucumber。
然后测试 class 会对 Spring 和 Cucumber 进行注释,如下所示:
@CucumberContextConfiguration
@SpringBootTest
public class SpringIntegrationTest {
// executeGet implementation
}