基于Spring Boot Hibernate JPA的DAO单元测试

7

我正在尝试为基于Spring Boot的应用编写单元测试,该应用使用Hibernate/JPA实体和DAO。以下是我迄今为止遵循的步骤:

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>

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 =

3) 我在../test/resources/import.sql文件中添加了一些“insert into…”数据创建脚本。

insert into groups(GROUP_NAME, THREAD_POOL_SIZE) values ("TEST GROUP 1", 5);

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)));
    }
}

当我运行这个测试时,我会收到像这样的错误信息:
org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table..
org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: user lacks privilege or object not found: PUBLIC.GROUP

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;

我错过了什么?


请发布您的Group实体映射及相关部分的应用程序配置。 - Alan Hay
我尝试将import.sql重命名为data.sql并创建schema.sql,其中创建组表,但仍然出现此错误。 - DilTeam
我不确定我改了什么,但现在它可以工作了。我所做的唯一一件事就是将所有必要的SQL添加到import.sql中。也许这就是原因。 - DilTeam
这些字段有对应的设置器和获取器吗? - msafadi
1个回答

1

DilTeam,我发现你的最后一条评论非常重要!

Spring不允许在ddl-auto=create-drop属性值下使用没有平台后缀的schema.sql

这部分在74.3 使用Spring JDBC初始化数据库中有描述:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接