繁体   English   中英

spring application.properties中的第二个数据源用于测试?

[英]Second datasource in spring application.properties for tests?

我在application.properties中将数据源定义为Oracle数据库,没关系,控制器和存储库工作正常,我可以保留实体并获取数据库记录。

我写了集成测试。 在将应用程序与数据库连接之前,我创建了一些对象并将其持久保存在@PostConstruct方法中-没关系。 但是现在,当我将所有内容与数据库连接时,我的测试会尝试从非常大的表中获取记录。 我认为这是由于我的application.properties文件中定义的数据源是Oracle数据库。

spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@blabla
spring.datasource.username=blabla
spring.datasource.password=blabla
spring.jpa.hibernate.ddl-auto=none
spring.jpa.generate-ddl=false

我想使用内存中的HSQL而不是真实的数据库进行测试。 但是我仍然希望我的控制器和存储库使用真正的控制器和存储库。 我该怎么做? 是否有可能在application.properties中添加第二个数据源? 还是更简单的解决方案?

在Spring 4中,您具有@Profile批注,因此可以利用其优势。 用它自己的属性创建另一个像application-test.properties文件。

创建测试配置:

@Configuration
@Profile("test") 
public class TestConfiguration {
    ....
}

然后使用@ActiveProfiles注释为您的课程@ActiveProfiles注释:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfiguration.class)
@ActiveProfiles("test")
public class TestRepository {
   ...
}

有很多方法可以实现这一点,一种方法是使用Spring概要文件。 测试概要文件将使用与生产概要文件不同的属性文件。

Spring具有org.springframework.mock.jndi.SimpleNamingContextBuilder程序包,该程序包允许您以编程方式绑定数据源。

我使用的样本测试类:

public class MockJNDIContext {

    @BeforeClass
    public static void setUpClass() throws Exception {

        SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
        OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();//Use your own Connection Pool DS here as you require
        ds.setURL("jdbc:oracle:thin:@10.xxx.xxx.xx:9999:SID");
        ds.setUser("USER");
        ds.setPassword("PASSWORD");
        //Bind it to the JNDI you need
        builder.bind("java:comp/env/jdbc/MY/APP", ds);

    }

    @Test
    public void test(){
        System.out.println("JNDI Initialized");
    }

}

套房类:

@RunWith(Suite.class)
@Suite.SuiteClasses({
        MockJNDIContext.class,
        InitializeTestConfig.class
})
public class ServiceSuite{
}

可能有帮助吗? 如果要从另外一个application.props中加载,请使用另外一个类( InitializeTestConfig.class ),该类初始化并传递DS args,然后如上所述添加到套件中并尝试?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM