简体   繁体   English

在测试中的Spring Environment中将@EnabledIf与spring.profiles.active属性一起使用

[英]Using @EnabledIf with spring.profiles.active property in Spring Environment within tests

According to the documentation ( https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/junit/jupiter/EnabledIf.html#expression-- ) you can use the @EnabledIf annotation on a test class or test method like so: 根据文档( https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/junit/jupiter/EnabledIf.html#expression-- ),您可以使用测试类或测试方法上的@EnabledIf批注,如下所示:

@EnabledIf("${smoke.tests.enabled}")

or 要么

@EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

where the string is a placeholder for property available in the Spring Environment. 该字符串是Spring Environment中可用属性的占位符。

Suppose I have the following application.yml file: 假设我有以下application.yml文件:

smoke:
  tests:
    enabled: true
spring:
  profiles:
    active: test

And the following test class: 以及以下测试类:

@EnabledIf(value = "#{${spring.profiles.active} == 'test'}", loadContext = true)
@SpringBootTest
public class SomeClassForTests {

    @Autowired SomeType autowiredType;

    @Test
    public void someTest() {
        // test logic...
    }

When I run the test I get the following error: 运行测试时,出现以下错误:

Test ignored.

org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [org.springframework.test.context.junit.jupiter.EnabledIfCondition]: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'test' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?

    at org.junit.jupiter.engine.execution.ConditionEvaluator.evaluationException(ConditionEvaluator.java:91)
    at org.junit.jupiter.engine.execution.ConditionEvaluator.evaluate(ConditionEvaluator.java:80)
    at org.junit.jupiter.engine.execution.ConditionEvaluator.lambda$evaluate$2(ConditionEvaluator.java:66)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:302)
    at java.base/java.util.stream.Streams$ConcatSpliterator.tryAdvance(Streams.java:723)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
    at org.junit.jupiter.engine.execution.ConditionEvaluator.evaluate(ConditionEvaluator.java:68)
    at org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.shouldBeSkipped(JupiterTestDescriptor.java:182)
    at org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.shouldBeSkipped(JupiterTestDescriptor.java:54)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$checkWhetherSkipped$1(NodeTestTask.java:91)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.checkWhetherSkipped(NodeTestTask.java:91)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'test' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:164)
    at org.springframework.test.context.junit.jupiter.AbstractExpressionEvaluatingCondition.evaluateExpression(AbstractExpressionEvaluatingCondition.java:164)
    at org.springframework.test.context.junit.jupiter.AbstractExpressionEvaluatingCondition.evaluateAnnotation(AbstractExpressionEvaluatingCondition.java:107)
    at org.springframework.test.context.junit.jupiter.EnabledIfCondition.evaluateExecutionCondition(EnabledIfCondition.java:46)
    at org.junit.jupiter.engine.execution.ConditionEvaluator.evaluate(ConditionEvaluator.java:75)
    ... 37 more
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'test' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:104)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:91)
    at org.springframework.expression.spel.ast.OpEQ.getValueInternal(OpEQ.java:42)
    at org.springframework.expression.spel.ast.OpEQ.getValueInternal(OpEQ.java:32)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:109)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:265)
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:161)
    ... 41 more

I am not too familiar with the Spring expression language. 我对Spring表达式语言不太熟悉。 What exactly am I doing wrong? 我到底在做什么错?


Update 1: 更新1:

Using the following two versions of the annotation: 使用以下两个版本的注释:

@EnabledIf(value = "${spring.profiles.active == 'test'}", loadContext = true)

or 要么

@EnabledIf(value = "#{spring.profiles.active == 'test'}", loadContext = true)

results in the following error: org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [org.springframework.test.context.junit.jupiter.EnabledIfCondition]: @EnabledIf("${spring.profiles.active == 'test'}") on class SomeClassForTests must evaluate to "true" or "false", not "${spring.profiles.active == 'test'}" 导致以下错误: org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [org.springframework.test.context.junit.jupiter.EnabledIfCondition]: @EnabledIf("${spring.profiles.active == 'test'}") on class SomeClassForTests must evaluate to "true" or "false", not "${spring.profiles.active == 'test'}"


Update 2: 更新2:

The following: 下列:

@EnabledIf(value = "${spring.profiles.active} == 'test'", loadContext = true)

results in the following error: 导致以下错误:

org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [org.springframework.test.context.junit.jupiter.EnabledIfCondition]: @EnabledIf("${spring.profiles.active} == 'test'") on class SomeClassForTests must evaluate to "true" or "false", not "test == 'test'"


Update 3: The answer of: 更新3:答案:

@EnabledIf(expression = "#{environment['spring.profiles.active'] == 'test'}", loadContext = true)

works when you have only one active profile. 只有一个有效的个人资料时有效。 How would you do it when you have many, such as below: 如果您有很多,您将如何做,例如:

smoke:
  tests:
    enabled: true
spring:
  profiles:
    active: 
    - test
    - someotherprofile

To check the exact value of a property from the Spring Environment , you should use the following approach. 要从Spring Environment检查属性的确切值,您应该使用以下方法。

@EnabledIf(expression = "#{environment['spring.profiles.active'] == 'test'}", loadContext = true)

To check which profiles are currently active in the Spring Environment , you should use the following approach. 要检查哪些配置文件在Spring Environment中当前处于活动状态,您应该使用以下方法。

@EnabledIf(expression = "#{environment.acceptsProfiles('test', 'someotherprofile')}", loadContext = true)

您的表情应如下所示:

@EnabledIf(value = "${spring.profiles.active == 'test'}", loadContext = true)

Try that with an extra apostrophe to wrap property when used in SpEL: 在SpEL中使用时,请尝试使用额外的撇号来包装属性:

@EnabledIf(value = "#{'${spring.profiles.active}' == 'test'}", loadContext = true)

I worked for me (finally!) when I tried to use custom property 当我尝试使用自定义属性时,我为我工作(最后!)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 spring.profiles.active 不兑现 - spring.profiles.active not honoured spring.profiles.active 在springboot应用程序中不起作用 - spring.profiles.active is not working in springboot application 使用 Gradle 从 Spring Boot 中的环境变量设置 spring.profiles.active - Setting spring.profiles.active from an environment variable in Spring Boot with Gradle "无法解析值“classpath:\/ldap-${spring.profiles.active}.properties”中的占位符“spring.profiles.active”" - Could not resolve placeholder 'spring.profiles.active' in value "classpath:/ldap-${spring.profiles.active}.properties" Spring 引导获取 static 块中的 spring.profiles.active 值 - Spring Boot get spring.profiles.active value in a static block 春季启动:spring.profiles.active = dev / test / prod - Spring Boot: spring.profiles.active=dev/test/prod Spring 引导 2.5.6 捕获 22 与 spring.profiles.active - Spring Boot 2.5.6 catch 22 with spring.profiles.active 从位置“类路径资源 [application-dev.yml]”导入的属性“spring.profiles.active”无效 - Property 'spring.profiles.active' imported from location 'class path resource [application-dev.yml]' is invalid 如何在Websphere Liberty 8.5中设置spring.profiles.active - how to setup spring.profiles.active in websphere liberty 8.5 SpEL 不解析简单的 ${spring.profiles.active} 表达式 - SpEL does not parse simple ${spring.profiles.active} expression
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM