【问题标题】:H2 Embedded database not picking up properties during test on spring bootH2 嵌入式数据库在 Spring Boot 测试期间未获取属性
【发布时间】:2017-10-23 09:02:03
【问题描述】:

我正在尝试创建一个使用嵌入式 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'

我希望 url 是这样的:jdbc:h2:mem:testdb,我还希望它采用 MODE=MYSQL 设置。

我尝试关注this post,但没有成功。

【问题讨论】:

    标签: java spring spring-boot junit h2


    【解决方案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 的行为。

    【讨论】:

      【解决方案2】:

      您需要告诉 Spring 不要将随机嵌入的数据库名称替换为以下内容:

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

      然后它应该获取您在 application.properties 中声明的属性。

      请随意推荐它是否适合你。

      【讨论】:

        【解决方案3】:

        这对我有用

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

        我使用这个类作为所有相关数据库集成类的基础。

        【讨论】:

        • 也许你的配置文件不在类路径中?
        • 我不认为这是问题所在,但我该如何排除呢?我对这一切还不是很熟悉
        猜你喜欢
        • 2018-06-13
        • 1970-01-01
        • 2019-10-10
        • 2011-01-02
        • 2017-07-11
        • 2012-10-22
        • 1970-01-01
        • 2019-05-17
        • 2018-10-09
        相关资源
        最近更新 更多