首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在springboottest中从默认的applicaton.yml中设置测试容器属性的更好方法

在springboottest中从默认的applicaton.yml中设置测试容器属性的更好方法
EN

Stack Overflow用户
提问于 2020-08-03 02:51:38
回答 1查看 1.2K关注 0票数 0

我在posgresql中使用posgresql测试容器。由于我有多个涉及这个测试容器的测试,所以我使用了静态测试容器,它将被调用一次,用于所有junit类的测试,并在执行所有测试后关闭。

这是我使用ParameterResolver,BeforeEachCallback实现的。

这种方法的问题是,数据源元数据(如jdbc-url、db名称、主机、默认配置的application.yml中配置的端口)不直接用于测试容器属性,相反,我硬编码了这些值,因为当时没有springboot属性。

是否有更好的方法可以使用具有BeforeEachCallback特性的静态测试容器,其值是从默认的application.yml ?中获取的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootTest
class SampleTest extends TestContainerBase {

    @Test
    void test1() {
        //some code
    }

}

@ExtendWith(ContainerExtension.class)
@ResourceLock(Environment.ID)
public abstract class TestContainerBase {

    protected static String jdbcUrl;
    protected static String username;
    protected static String password;

    @BeforeAll
    static void prepareContainerEnvironment(Environment env) {
        jdbcUrl = env.getJdbcUrl();
        username = env.getUsername();
        password = env.getPassword();
    }

    @DynamicPropertySource
    static void dynamicPropertySource(DynamicPropertyRegistry registry) {

        registry.add("spring.datasource-.jdbc-url", () -> jdbcUrl);
        registry.add("spring.datasource-.username", () -> username);
        registry.add("spring.datasource-.password", () -> password);
        registry.add("spring.datasource-.driver-class-name", () -> "org.postgresql.Driver");
    }

}

public class ContainerExtension implements ParameterResolver, BeforeEachCallback {
    
    // overridden supportsParameter and resolveParameter
}

我希望myDB,sa,sa能从application.yml上读出来。在这个类中,我如何获得application.yml值?由于springboot上下文尚未加载,因此我无法想到获得这些值的任何替代方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ContainerResource extends Environment {

    @Container
    protected static PostgreSQLContainer postgreSQLContainer =
            new PostgreSQLContainer("artifactory.devtools.syd.c1.macquarie.com:9996/postgres:11")
                    .withDatabaseName("myDB")
                    .withUsername("username")
                    .withPassword("password");
    
    ContainerEnvironmentResource() {
        postgreSQLContainer.start();
        this.setJdbcUrl(postgreSQLContainer.getJdbcUrl());
        this.setUsername(postgreSQLContainer.getUsername());
        this.setPassword(postgreSQLContainer.getPassword());
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-13 07:04:32

看起来现在有一个专门的项目来集成Testcontainers和Spring。就我所理解的文档而言,它对代码应该是透明的,因为一切都是使用Spring魔法完成的。

https://github.com/Playtika/testcontainers-spring-boot

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63228109

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文