首页 > 解决方案 > 如何在现有应用程序中使用测试容器?

问题描述

语境:

我有一个现有的 Camel 应用程序。为了使用 Spring Boot 工具对其进行测试,它被包装到 Spring Boot 框架中,并且所有测试都针对这个Spring Boot应用程序运行。重要提示:此代码用于生产,因此我不能完全更改实现和重写测试。为了在我使用的类似 prod 的环境testcontainers和 Docker 中的 Microsoft SQL Server 中测试应用程序,它是一个附加的功能测试模块。

我要做的是启动testcontainers和更新DataSource,因此它将指向 SQL Server 端点。我遇到了一系列永无止境的问题。我究竟做错了什么?

问题:

我的SpringBootTestApplication样子:

@SpringBootApplication
public class SpringBootTestApplication {

    @Bean(name = "myDataSource")
    public DataSource dataSource() throws ClassNotFoundException {
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(Class.forName("org.apache.derby.jdbc.EmbeddedDriver").asSubclass(Driver.class));
        dataSource.setUrl("jdbc:derby:memory:testdb;create=true");
        dataSource.setUsername("sa");
        dataSource.setPassword("");

        Resource initSchema = new ClassPathResource("db/schema.sql");
        ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema);
        databasePopulator.setIgnoreFailedDrops(true);
        DatabasePopulatorUtils.execute(databasePopulator, dataSource);
        return dataSource;
    }


    public static void main(String[] args) {
        SpringApplication.run(SpringBootTestApplication.class, args);
    }
}

我的测试看起来是这样的:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootTestApplication.class)
@TestPropertySource("classpath:application-test.properties")
public class LargeDatabaseRetrieverTest {

    @Rule
    public MSSQLServerContainer mssqlServerContainer = (MSSQLServerContainer) new MSSQLServerContainer()
            .withInitScript("db/test-data-mssql.sql")
            .withExposedPorts(1433);

    @Autowired
    @Qualifier("myDataSource")
    private DataSource dataSource;

    @Before
    public void setUp() throws Exception {
        mssqlServerContainer.start();

        DataSource mssqlDataSource = configureDataSource();
        AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
        factory.autowireBean(mssqlDataSource);
    }

    @After
    public void tearDown() throws Exception {
        mssqlServerContainer.stop();
    }

    private DataSource configureDataSource() {
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setDriverClassName(mssqlServerContainer.getDriverClassName());
        basicDataSource.setUrl(mssqlServerContainer.getJdbcUrl());
        basicDataSource.setUsername(mssqlServerContainer.getUsername());
        basicDataSource.setPassword(mssqlServerContainer.getPassword());
        return basicDataSource;
    }

    @Test
    public void test() {
        // Use DataSource in here
    }

}

我正在尝试动态加载DataSource到测试中,因此我将针对 MS SQL Server 进行测试,而不是针对默认的内存配置进行测试。

问题是我不知道 MS SQL Server Docker 容器的配置,直到它启动,我无法动态注入我自己的 DataSource 实现。

尝试的解决方案列表:

以上解决方案均无效。我好像做错了什么,在三棵白桦树之间迷路了。我究竟做错了什么?

标签: javaspring-boottestcontainers

解决方案


您是否检查过Spring Boot 的文档以了解如何将其与 Testcontainers 一起使用?还是Testcontainers 的 Spring Boot 示例

还有一个车间

最后但同样重要的是,如果您只需要一个 SQL 数据库,您可以使用JDBC URL 支持


推荐阅读