H2嵌入式数据库在春季启动测试期间没有获取属性

时间:2017-05-23 12:02:20

标签: java spring spring-boot junit h2

我正在尝试创建一个使用嵌入式H2数据库的测试。但我必须更改spring.datasource.url,我不能使用spring boot创建的默认值。 (这是因为我必须将H2数据库的模式更改为MYSQL)

这是我的test class

@JdbcTest
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
public class DemoApplicationTests {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() {
        System.out.println(dataSource);
   }
}

这是我的application-test.properties

 spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
 spring.datasource.username=dbuser
 spring.datasource.password=dbpass

我的依赖项:

compile('org.springframework.boot:spring-boot-starter-batch')
runtime('com.h2database:h2')
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '1.5.3.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.3.RELEASE'

控制台输出:

  

启动嵌入式数据库:url =' jdbc:h2:mem:bfad6b71-3e2d-4a47-a32d-c76988b3c5f6; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = false',username =' sa&#39 ;

我希望网址是这样的:jdbc:h2:mem:testdb,我还希望它能够选择MODE=MYSQL设置。

我试图关注this post,但它没有效果。

3 个答案:

答案 0 :(得分:6)

您需要告诉Spring不要使用以下内容替换随机嵌入式数据库名称:

  

@AutoConfigureTestDatabase(替换=   AutoConfigureTestDatabase.Replace.NONE)

然后它应该选择你在application.properties中声明的属性。

请随时推荐它是否适合您。

答案 1 :(得分:2)

这对我有用

@RunWith(SpringRunner.class)
@TestPropertySource(locations = "classpath:application-mysql.properties")
@SpringBootTest
public abstract class ExternalDbApplicationTestBase {

}

我将此类用作所有相关数据库集成类的基础。

答案 2 :(得分:1)

Spring Boot的@DataJdbcTest@DataJpaTest@JdbcTest@AutoConfigureTestDatabase都将最终调用TestDatabaseAutoConfiguration,而后者默认将配置一个具有自动生成的唯一名称的内存嵌入式数据库实例。

例如,这可能会给您带来问题。您碰巧使用具有@Table且属性catalog为非空白的JPA实体,因为H2要求目录名称必须与其数据库名称相同。

如丹恩·萨沃特(Dane Savot)在回答中所说

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

将解决该测试类的问题,但是如果要全局解决,请添加

spring.test.database.replace=none

到您的src/test/resources/application.properties.yaml。该属性控制@AutoConfigureTestDatabase.replace的行为。