Spring引导基于Hibernate JPA的DAO的单元测试

Dil*_*eam 7 spring unit-testing hibernate jpa spring-boot

我正在尝试为使用Hibernate/JPA实体和DAO的基于Spring Boot的应用程序编写单元测试.以下是我到目前为止所遵循的步骤:

1)在pom.xml中添加了以下内容

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

2)在../test/resources/application.properties中,我添加了这个:

spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.database = HSQL
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect
spring.datasource.driverClassName = org.hsqldb.jdbcDriver
spring.datasource.url: jdbc:hsqldb:mem:scratchdb
spring.datasource.username = sa
spring.datasource.password =
Run Code Online (Sandbox Code Playgroud)

3)在../test/resources/import.sql中我添加了一些'insert into ...',数据创建脚本.

insert into groups(GROUP_NAME, THREAD_POOL_SIZE) values ("TEST GROUP 1", 5);
Run Code Online (Sandbox Code Playgroud)

4)单元测试如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)

public class TestGroupDao {

    @Autowired
    GroupDao groupDao;

    @Test
    public void testFindByName() {

        Group group = groupDao.findByName("TEST GROUP 1");
        //assertThat(group.getPoolSize(), is(equalTo(5)));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时,我收到错误消息,例如:

org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table..
org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: user lacks privilege or object not found: PUBLIC.GROUP
Run Code Online (Sandbox Code Playgroud)

5)集团实体:

@Entity
@javax.persistence.Table(name = "groups", uniqueConstraints = {
        @UniqueConstraint(columnNames = "GROUP_NAME"),
})
public class Group {

    // ==============
    // PRIVATE FIELDS
    // ==============

    // An autogenerated id (unique for each group in the db)
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "GROUP_ID", unique = true, nullable = false)
    private long id;

    @Column(name = "GROUP_NAME", unique = true, nullable = false)
    private String name;
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Kon*_*hev 1

DilTeam,我发现您最后的评论非常重要!

Spring 不允许将schema.sql(没有平台后缀)与ddl-auto=create-drop属性值一起使用。

这部分的描述见74.3 使用 Spring JDBC 初始化数据库

如果您想在 JPA 应用程序(使用 Hibernate)中使用 schema.sql 初始化,那么当 Hibernate 尝试创建相同的表时 ddl-auto=create-drop 将导致错误。为了避免这些错误,请将 ddl-auto 显式设置为“”(首选)或“none”。无论您是否使用 ddl-auto=create-drop 您始终可以使用 data.sql 来初始化新数据。