簡體   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