Bar*_*rge 5 java junit spring spring-test
我正在尝试为Spring Boot(Spring 4)应用程序编写测试.
我的Junit测试类配置如下,以允许自动装配.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringApp.class)
public class MyServiceTest {
...
Run Code Online (Sandbox Code Playgroud)
我src/main/resources/application.properties是这样的
spring.jpa.database=POSTGRESQL
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost/mydb
spring.datasource.username=BNF0016779
spring.datasource.password=
Run Code Online (Sandbox Code Playgroud)
在测试上下文中,src/test/resources/application.properties只是空的.
在像往常一样查询数据库,创建对象...
但我想创建一个数据init sql.
从一个奇怪的行为开始,似乎Spring在类路径中加载任何"schema.sql".不需要像下面这样的东西?
//This is not required to execute schema.sql
@Configuration
public class DatabaseTestConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我无法从此SQL创建任何表.永远收到org.h2.jdbc.JdbcSQLException: Table "MY_TABLE" already exists; SQL statement:
H2应该是一个内存中的数据库,两个启动之间不保存数据!为什么我会收到这些错误?
有任何想法吗 ?谢谢
实际上,Spring Boot将schema.sql默认执行类路径根目录中指定的文件.此外,Spring Boot还将自动为您的应用程序创建一个嵌入式数据库,除非您另外指示它.有关详细信息,请参阅Spring Boot参考手册中的" 使用Spring JDBC初始化数据库 "部分.
H2应该是一个内存中的数据库,两个启动之间不保存数据!
是的,不是.
如果Spring Boot为您创建了一个嵌入式H2数据库,那么它将在内存中.
但是,数据库实际上是一个bean ApplicationContext(就像任何其他Spring管理的组件一样).因此它与生命一样长寿ApplicationContext,Spring TestContext Framework缓存测试之间的上下文:这是它的主要特征之一.换句话说,嵌入式数据库不会在测试之间重新创建(除非您使用注释测试类或测试方法@DirtiesContext).有关详细信息,请参阅Spring Framework参考手册的Context缓存部分.
问候,
Sam(Spring TestContext Framework的作者)
| 归档时间: |
|
| 查看次数: |
3911 次 |
| 最近记录: |