无法将容器初始化作为Spring配置文件的一部分移动

dauxcl2d  于 7个月前  发布在  Spring
关注(0)|答案(1)|浏览(85)

对于我的集成测试,我需要一个运行的MySQL数据库。我决定通过Testcontainers模块设置它。下面是我如何运行它。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("integration-test")
public class IntegrationTest {

    static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));

    static {
        mysql.start();
    }

    @DynamicPropertySource
    static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
        dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
        dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
        dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
    }
}

字符串
这是可行的,但我有几个集成测试类,使用相同的几行来启动容器感觉是一个糟糕的做法。我宁愿有一个类-比如integration-test Spring profile -并在那里启动它一次。类似于这样:

@Configuration
@Profile("integration-test")
public class IntegrationTestProfile {

    static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));

    static {
        mysql.start();
    }

    @DynamicPropertySource
    static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
        dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
        dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
        dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
    }
}


容器被启动了(我可以在日志中看到),但是属性没有被动态覆盖,而是使用了来自application.properties的属性。
我该怎么弥补?

cwdobuhd

cwdobuhd1#

您可以创建一个抽象BaseIntegrationTest,并从它扩展所有涉及Testcontainers的测试:容器和应用程序上下文都将启动一次,并在测试中共享:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("integration-test")
public abstract class BaseIntegrationTest {

    static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));

    static {
        mysql.start();
    }

    @DynamicPropertySource
    static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
        dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
        dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
        dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
    }
}

// The following tests share the same container and application context

class SomeRepositoryTest extends BaseIntegrationTest {
//...
}

class AnotherRepositoryTest extends BaseIntegrationTest {
//...
}

字符串

相关问题