如何使用弹簧启动和 spock 运行测试容器



我想在我的 Spring 启动应用程序上使用带有 spock 的测试容器。

这些是我的依赖项:

dependencies {
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile('org.springframework.boot:spring-boot-starter-web')
compile 'org.testcontainers:spock:1.8.3'
runtime('org.springframework.boot:spring-boot-devtools')
compile 'org.codehaus.groovy:groovy-all:2.4.15'
compileOnly('org.projectlombok:lombok')
compile 'org.testcontainers:testcontainers:1.8.3'
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile "org.spockframework:spock-core:1.1-groovy-2.4-rc-4"
testCompile "org.spockframework:spock-spring:1.1-groovy-2.4-rc-4"
testCompile 'com.github.testcontainers:testcontainers-spock:-SNAPSHOT'
}

我已经初始化了我的测试,如下所示:

@SpringBootTest
@Testcontainers
class ProductRedisRepositoryTest extends Specification {
@Autowired
ProductRedisRepository productRedisRepository
@Autowired
TestComponent testComponent

static Consumer<CreateContainerCmd> cmd = { -> e.withPortBindings(new PortBinding(Ports.Binding.bindPort(6379), new ExposedPort(6379)))}
@Shared
public static GenericContainer redis =
new GenericContainer("redis:3.0.2")
//.withExposedPorts(6379)
.withCreateContainerCmdModifier(cmd)
def "check redis repository save and get"(){
given:
Product product = Product.builder()
.brand("brand")
.id("id")
.model("model")
.name( "name")
.build()
when:
productRedisRepository.save(product)
Product persistProduct = productRedisRepository.find("id")
then:
persistProduct.getName() == product.getName()
}
}

但是当我运行测试时,它不会启动 redis 容器。 我的错误是什么。我该怎么做。

我的springBootVersion = '2.0.4.RELEASE',我正在使用Intelij。

这是日志输出:日志

请在@SharedGenericContainer字段中删除static关键字。

静态字段不会由 Spock 框架用@FieldMetadata注释,因此它们不会被视为规范字段的一部分。 Testcontainers-Spock 依靠这些字段来识别 GenericContainers。

如果您需要static修饰符,您可以像这样解决此问题:

...
public static GenericContainer staticRedis =
new GenericContainer("redis:3.0.2")
//.withExposedPorts(6379)
.withCreateContainerCmdModifier(cmd)
@Shared
public GenericContainer redis = staticRedis
...

最新更新