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

dauxcl2d  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(187)

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

  1. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  2. @ActiveProfiles("integration-test")
  3. public class IntegrationTest {
  4. static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));
  5. static {
  6. mysql.start();
  7. }
  8. @DynamicPropertySource
  9. static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
  10. dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
  11. dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
  12. dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
  13. }
  14. }

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

  1. @Configuration
  2. @Profile("integration-test")
  3. public class IntegrationTestProfile {
  4. static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));
  5. static {
  6. mysql.start();
  7. }
  8. @DynamicPropertySource
  9. static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
  10. dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
  11. dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
  12. dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
  13. }
  14. }


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

cwdobuhd

cwdobuhd1#

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

  1. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  2. @ActiveProfiles("integration-test")
  3. public abstract class BaseIntegrationTest {
  4. static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));
  5. static {
  6. mysql.start();
  7. }
  8. @DynamicPropertySource
  9. static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
  10. dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
  11. dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
  12. dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
  13. }
  14. }
  15. // The following tests share the same container and application context
  16. class SomeRepositoryTest extends BaseIntegrationTest {
  17. //...
  18. }
  19. class AnotherRepositoryTest extends BaseIntegrationTest {
  20. //...
  21. }

字符串

展开查看全部

相关问题