我在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中添加第二个数据源?或者更简单的解决方案?
答案 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并添加到套件中,如上所述并尝试?