在通过JUnit4测试将Spring Boot插入到h2database中时使用问题

时间:2019-04-23 16:16:01

标签: java spring-boot junit junit4 h2

正在关注有关如何设置Spring Boot项目并针对h2数据库编写单元测试的在线教程...

Spring Boot在编写JUnit测试方面是新手,也是使用内存h2数据库的新手。

写了一个测试,现在不起作用了!


pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>

</dependencies>

代码结构

demo
 ├── mvnw
 ├── mvnw.cmd
 ├── pom.xml
 └── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── demo
    │   │               ├── Booking.java
    │   │               ├── DemoApplication.java
    │   │               └── ReservationRepository.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        ├── java
        │   └── com
        │       └── example
        │           └── demo
        │               └── DemoApplicationTests.java
        └── resources
            └── data.sql

Booking.java

@Entity
public class Booking {

    @Id
    @GeneratedValue
    private Long id;

    // booking_name
    private String bookingName;

    // group_size
    private int groupSize;

    Booking(){ }

    public Booking(String bookingName, int groupSize) {
        this.bookingName = bookingName;
        this.groupSize = groupSize;
    }

    // Getters & setters omitted for brevity
}               

ReservationRepository

import org.springframework.data.jpa.repository.JpaRepository;

public interface ReservationRepository extends JpaRepository<Booking, Long> {
}

DemoApplicationTests

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    ReservationRepository reservationRepository;

    @Test
    public void contextLoads() {
        Assert.assertNotNull("The reservation repository should be non-null", this.reservationRepository);
    }

    @Test
    public void testLoadingResultsInDatabase() {
        List<Booking> bookings = this.reservationRepository.findAll();
        Assert.assertNotNull("There must be a response", bookings);
        Assert.assertTrue("There should be at least one booking", bookings.size() > 0);
    }
}

data.sql

insert into booking ( booking_name, group_size) values ('LiveLessons', 1000);
insert into booking ( booking_name, group_size) values ('John Doe', 1);

当我运行此JUnit测试时:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/home/work/demo/target/test-classes/data.sql]: insert into booking ( booking_name, group_size) values ('LiveLessons', 1000); nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
insert into booking ( booking_name, group_size) values ('LiveLessons', 1000) [23502-199]

Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/home/work/demo/target/test-classes/data.sql]: insert into booking ( booking_name, group_size) values ('LiveLessons', 1000); nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
insert into booking ( booking_name, group_size) values ('LiveLessons', 1000) [23502-199]
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:509) ~[spring-jdbc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:238) ~[spring-jdbc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
insert into booking ( booking_name, group_size) values ('LiveLessons', 1000) [23502-199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:457) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.199.jar:1.4.199]

我可能做错了什么?

1 个答案:

答案 0 :(得分:0)

您在SQL中缺少ID。