groovy 是否可以使spock规范对Spring的www.example.com中的属性有条件application.properties?

o8x7eapl  于 2022-11-01  发布在  Spring
关注(0)|答案(1)|浏览(176)

背景说明:

  • Java 11和Sping Boot 2.6.6中的项目逻辑
  • 一些项目特性是有条件可用的,这取决于特定的应用程序属性,一些与条件特性相关的Spring组件也依赖于对组件使用@ConditionalOnProperty注解
  • 测试(也包括集成)是用groovy和spock框架(2.1版-groovy-3.0版)编写的。

问题:是否可以使spock规范以spring的www.example.com中的属性为条件application.properties?
Spock框架提供了使测试具有条件的注解。对于我的情况,最准确的注解似乎是@Requires。(https://spockframework.org/spock/docs/2.1/all_in_one.html#_requires)条件基于先决条件上下文(https://spockframework.org/spock/docs/2.1/all_in_one.html#precondition_context)。
简化的规范示例(两个工作@需要注解作为示例,但它们不检查我的情况下需要什么):

import org.spockframework.runtime.extension.builtin.PreconditionContext
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.context.ContextConfiguration
import spock.lang.Requires
import spock.lang.Specification

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles('integration')
@ContextConfiguration(classes = TestSpringBootApplication)
//TODO: How to make this feature dependent of property from application.properties?
//@Requires(reason = 'Specification for AAA feature enabled', value = { isFeatureAAAEnabled() })
//@Requires(reason = 'Test run only on Linux', value = { PreconditionContext preconditionContext -> preconditionContext.os.windows })
class ConditionalSpec extends Specification {

    //Some conditional components @Autowired

    //feature methods
    def "one plus one should equal two"() {
        expect:
        1 + 1 == 2
    }

    private static boolean isFeatureAAAEnabled() {
        true
    }
}
xoshrz7s

xoshrz7s1#

你到底想要什么,是不运行任何测试但仍然启动Spring上下文就足够了,还是你也想避免启动Spring上下文?
如果它是第一个,则可以使用前提条件上下文中的instanceshared。如果启用了共享字段注入,则应该可以执行此操作。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles('integration')
@ContextConfiguration(classes = TestSpringBootApplication)
@EnableSharedInjection
@Requires(reason = 'Specification for AAA feature enabled', value = { shared.myValue == 'featureAAA' })
class ConditionalSpec extends Specification {

    @Value('${value.from.file}')
    @Shared
    String myValue

    //feature methods
    def "one plus one should equal two"() {
        expect:
        1 + 1 == 2
    }
}

如果由于共享注入的限制而无法使用它,则必须在条件中将shared替换为instance
如果你想避免启动spring,那么你必须编写自己的扩展来计算application.properties的值,并且自己跳过规范。

相关问题