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

时间:2015-08-13 09:38:17

标签: java spring jpa integration-testing hsqldb

我在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中添加第二个数据源?或者更简单的解决方案?

3 个答案:

答案 0 :(得分:2)

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

为您的测试创建配置:

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Spring有org.springframework.mock.jndi.SimpleNamingContextBuilder包,允许您以编程方式绑定dataSource。

我使用的示例测试类:

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并添加到套件中,如上所述并尝试?