如何配置testcontainer以运行docker与gradle?

p8ekf7hl  于 2022-11-22  发布在  Docker
关注(0)|答案(1)|浏览(167)

对于我的项目,我需要有一个启动测试容器的任务,但是当我试图启动我的任务时,我遇到了以下错误

Previous attempts to find a Docker environment failed. Will not retry. Please see logs and check configuration

我觉得是配置问题。
我正在使用Kotlingradle,我的构建文件看起来像这样:

import org.testcontainers.containers.PostgreSQLContainer

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    testImplementation("org.testcontainers:postgresql")
}

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
    }
    dependencies {
        "classpath"("org.testcontainers:postgresql:1.17.5")
    }
}

tasks.register("postgresContainer") {
    val containerInstance = PostgreSQLContainer<Nothing>("postgres:12.8")
        .apply {
            withDatabaseName("test")
        }
    containerInstance.start()
    extra["containerUrl"] = containerInstance.jdbcUrl
    extra["containerUsername"] = containerInstance.username
    extra["containerPassword"] = containerInstance.password
    extra["containerDatabaseName"] = containerInstance.databaseName
    extra["containerInstance"] = containerInstance
}

我已经省略了大部分内容,但找不到我遗漏的内容
我试图参考测试容器的文档,但无法找到我的具体情况,Docker似乎配置正确,我认为错误来自我的build.kts

sczxawaw

sczxawaw1#

我建议如下。
将其添加到您的build.gradle.kts文件以添加对测试容器的支持(此特定示例是针对PostgreSQL的,但理念是相同的...):

dependencies {
    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:postgresql:$testContainerVersion")
}

dependencyManagement {
    imports {
        mavenBom("org.testcontainers:testcontainers-bom:$testContainerVersion")
    }
}

将以下内容作为全局变量添加到测试类中:

val postgreSQLContainer = PostgreSQLContainer<Nothing>("postgres:14")
    .apply {
        withReuse(true)
        start()
    }

就我个人而言,我已经将其添加到AbstractIntegrationTest类中,并在那里配置了容器,如下所示:

abstract class AbstractIntegrationTest {
   companion object {
        @JvmStatic
        @DynamicPropertySource
        fun properties(registry: DynamicPropertyRegistry) {
            registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl)
            registry.add("spring.datasource.username", postgreSQLContainer::getUsername)
            registry.add("spring.datasource.password", postgreSQLContainer::getPassword)
        }
    }
}

请注意,withReuse(true)只是一个优化,它确保不会为每个测试重新创建DB,因为这是一个繁重的操作,因此您需要在测试之间以编程方式截断表...
例如:

@BeforeEach
fun setUp() {
    // Test util class that truncate all tables
    repoUtils.cleanTables()
}

相关问题