【问题标题】:Second datasource in spring application.properties for tests?spring application.properties 中的第二个数据源用于测试?
【发布时间】:2015-11-06 04:58:08
【问题描述】:

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

【问题讨论】:

  • 你用的是什么构建工具?
  • 这是春季启动应用程序

标签: java spring jpa integration-testing hsqldb


【解决方案1】:

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

【讨论】:

    【解决方案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 {
       ...
    }
    

    【讨论】:

    • TestConfiguration 类中究竟应该包含什么?现在我没有配置,只有使用存储库方法保存对象的 @Before 方法。我使用 Rest Assured 来测试我的控制器。
    • 你有可能使用 Spring Boot 吗?
    • 是的,这是 Spring Boot 应用程序
    • 所以@ActiveProfiles [在我的测试类之上] 引用 application-test.properties 就足够了吗?看起来不错,但我不知道如何在那里配置 hsqldb 才能正确使用。
    【解决方案3】:

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

    【讨论】:

    • 我通过@Table注解链接到oracle表的实体类呢?它必须在控制器/存储库以及测试中使用。
    • 您的测试数据库将具有与真实数据库相似的表,但为空(或更可能是一些测试数据)。
    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 2018-09-17
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2019-04-24
    • 2014-11-30
    相关资源
    最近更新 更多