我正在使用Spring boot2,我正在尝试使用H2 + Liquibase + JUNIT配置一个单元测试。
我认为liquibase没有执行changeLog文件并应用SQL命令,单元测试无法识别我的表。
我在文件中放入了错误的sql,以查看是否已执行了changelog文件,但是似乎未在执行。
为什么我的应用程序无法访问表?也许liquibase没有执行?
我的 src / test / resource 中的我有这个文件: application.yml
spring:
application:
name: my-api
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:myDB;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password: sags
liquibase:
enabled: true
user: sa
password: sags
change-log: classpath:/db/changelog/db.changelog-master.xml
jpa:
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.H2Dialect
show-sql: true
properties:
hibernate:
use_sql_comments: true
format_sql: true
h2:
console:
enabled: true
path: /console
我的测试班:
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class FooRepositoryTest {
@Autowired
private FooRepository fooRepository;
@Test
public void findAllMustReturnAnything() {
List<Object> result = fooRepository.tables();
}
}
FooRepository方法:
@Query(value = "SHOW TABLES", nativeQuery = true)
List<Object> tables();
运行单元测试时,我得到以下结果:
我的变更日志文件位于: src / main / resources / db
更新:我发现了为什么liquibase无法执行我的sql代码。这是因为我的SQL文件具有“ dbms:mysql”,因此,我如何使用H2 liquibase执行该方法将不适用。
-- changeset 1.0:2 dbms:mysql
command
-- rollback command
现在,我需要知道为什么我在会话中选择的数据库不是myDB。
答案 0 :(得分:0)
我认为在您的情况下,Spring会打开自动配置数据源。(https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/api/org/springframework/boot/test/autoconfigure/orm/jpa/AutoConfigureTestDatabase.Replace.html)
尝试将其关闭。
spring.test.database.replace=none
还有一些不必要的配置。
liquibase:
user: sa
password: sags
您可以删除用户名和密码,liquibase可以从数据源中使用它。