根据文档(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/junit/jupiter/EnabledIf.html#expression--),您可以使用@EnabledIf
批注
在这样的测试类或测试方法上:
@EnabledIf("${smoke.tests.enabled}")
或
@EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
其中字符串是Spring环境中可用属性的占位符。
假设我有以下application.yml
文件:
smoke:
tests:
enabled: true
spring:
profiles:
active: test
以及以下测试类:
@EnabledIf(value = "#{${spring.profiles.active} == 'test'}", loadContext = true)
@SpringBootTest
public class SomeClassForTests {
@Autowired SomeType autowiredType;
@Test
public void someTest() {
// test logic...
}
运行测试时,出现以下错误:
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
我对Spring表达式语言不太熟悉。 我到底在做什么错?
更新1:
使用以下两个版本的注释:
@EnabledIf(value = "${spring.profiles.active == 'test'}", loadContext = true)
或
@EnabledIf(value = "#{spring.profiles.active == 'test'}", loadContext = true)
导致以下错误:
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'}"
更新2:
以下内容:
@EnabledIf(value = "${spring.profiles.active} == 'test'", loadContext = true)
导致以下错误:
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'"
更新3: 答案:
@EnabledIf(expression = "#{environment['spring.profiles.active'] == 'test'}", loadContext = true)
仅在一个活动配置文件时有效。当您有很多东西时,您将如何做?例如:
smoke:
tests:
enabled: true
spring:
profiles:
active:
- test
- someotherprofile
答案 0 :(得分:1)
要检查Spring navigation.navigate('MainNavigator', {}, NavigationActions.navigate({ routeName: 'Requests' }))
中某个属性的确切值,您应该使用以下方法。
navigation.navigate(NavigationActions.navigate({
routeName: 'MainNavigator',
action: NavigationActions.navigate({ routeName: 'Requests' })
}))
要检查哪些配置文件在Spring Environment
中当前处于活动状态,应使用以下方法。
@EnabledIf(expression = "#{environment['spring.profiles.active'] == 'test'}", loadContext = true)
答案 1 :(得分:0)
您的表情应如下所示:
@EnabledIf(value = "${spring.profiles.active == 'test'}", loadContext = true)
答案 2 :(得分:0)
在SpEL中使用时,请尝试使用额外的撇号来包装属性:
@EnabledIf(value = "#{'${spring.profiles.active}' == 'test'}", loadContext = true)
当我尝试使用自定义属性时,我为我工作(最后!)