2017-05-14 15 views
8

Tôi có bảng sau (di cư):NullPointerException trong khi chạy thử nghiệm đơn vị chống lại cơ sở dữ liệu Postgres với Unitils

databaseChangeLog: 
    - changeSet: 
     id: 1 
     author: me 
     changes: 
     - createTable: 
      tableName: person 
      columns: 
       - column: 
        name: id 
        type: int 
        autoIncrement: true 
        constraints: 
        primaryKey: true 
        nullable: false 
       - column: 
        name: first_name 
        type: varchar(255) 
        constraints: 
        nullable: false 
       - column: 
        name: last_name 
        type: varchar(255) 
        constraints: 
        nullable: false 
    - changeSet: 
     id: 2 
     author: me 
     changes: 
     - insert: 
      tableName: person 
      columns: 
       - column: 
        name: first_name 
        value: First 
       - column: 
        name: last_name 
        value: Last 

Và DAO sau đây:

public interface HelloDao { 
    @SqlQuery(
      "SELECT * FROM person" 
    ) 
    @Mapper(PersonMapper.class) 
    Person getPerson(); 
} 

Với các đối tượng sau + mapper:

public class Person { 
    private String firstName; 
    private String lastName; 

    public Person(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

-

public class PersonMapper implements ResultSetMapper<Person> { 
    public Person map(int index, ResultSet r, StatementContext ctx) throws SQLException { 
     return new Person(r.getString("first_name"), r.getString("last_name")); 
    } 
} 

Tôi đang sử dụng junit và unitils để viết một bài kiểm tra đơn vị cho Đạo này. Tôi đã tập tin unitils.properties thiết lập như sau:

database.driverClassName=org.postgresql.Driver 
database.url=jdbc:postgresql://localhost:5432/springbootdb 
database.dialect=postgresql 
database.userName=<username> 
database.password=<password> 
database.schemaNames=public 

Chỉ cần cho rõ ràng, điều này application.properties tập tin của tôi:

spring.thymeleaf.cache=false 
spring.main.show-banner=false 
logging.level.jdbc=OFF 
logging.level.jdbc.sqltiming=DEBUG 
logging.level.jdbc.resultsettable=DEBUG 

spring.datasource.url= jdbc:postgresql://localhost:5432/springbootdb 
spring.datasource.username=<username> 
spring.datasource.password=<password> 
spring.jpa.hibernate.ddl-auto=create-drop 

Đây là thử nghiệm của tôi:

@Transactional(TransactionMode.ROLLBACK) 
@RunWith(UnitilsBlockJUnit4ClassRunner.class) 
public class HelloDaoTest { 
    @TestDataSource 
    DataSource dataSource; 

    private DBI dbi; 
    private HelloDao helloDao; 

    @Before 
    public void setUp() throws Exception { 
     dbi = new DBI(dataSource); 
     helloDao = dbi.onDemand(HelloDao.class); 
    } 

    @Test 
    @DataSet("HelloDaoTest.testSet.xml") 
    public void helloDao() throws Exception { 
     Person p = helloDao.getPerson(); 
     assertEquals("First", p.getFirstName()); 
    } 

} 

Và cố của tôi (HelloDaoTest.testSet.xml)

<?xml version="1.0" encoding="UTF-8" ?> 
    <dataset> 
     <person 
      first_name="First" 
      last_name="Last" 
     /> 
    </dataset> 

và tập tin pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.experiment.springboot</groupId> 
    <artifactId>testspringbootproj</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>Spring Boot Blank Project (from https://github.com/making/spring-boot-blank)</name> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.7.RELEASE</version> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <start-class>com.experiment.springboot.App</start-class> 
     <java.version>1.8</java.version> 
     <lombok.version>1.14.8</lombok.version> 
     <log4jdbc.log4j2.version>1.16</log4jdbc.log4j2.version> 
     <rest.assured.version>2.3.3</rest.assured.version> 
     <jdbi.version>2.78</jdbi.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</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> 
     <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <version>${lombok.version}</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.jayway.restassured</groupId> 
      <artifactId>rest-assured</artifactId> 
      <version>${rest.assured.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.bgee.log4jdbc-log4j2</groupId> 
      <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId> 
      <version>${log4jdbc.log4j2.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.4-1206-jdbc42</version> 
     </dependency> 
     <dependency> 
      <groupId>org.jdbi</groupId> 
      <artifactId>jdbi</artifactId> 
      <version>${jdbi.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.liquibase</groupId> 
      <artifactId>liquibase-core</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.liquibase</groupId> 
      <artifactId>liquibase-maven-plugin</artifactId> 
      <version>3.4.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.unitils</groupId> 
      <artifactId>unitils-dbunit</artifactId> 
      <version>3.4.6</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <dependencies> 
        <dependency> 
         <groupId>org.springframework</groupId> 
         <artifactId>springloaded</artifactId> 
         <version>${spring-loaded.version}</version> 
        </dependency> 
       </dependencies> 
      </plugin> 
      <plugin> 
       <groupId>org.liquibase</groupId> 
       <artifactId>liquibase-maven-plugin</artifactId> 
       <version>3.4.1</version> 
       <configuration> 
        <propertyFile>src/main/resources/liquibase.properties</propertyFile> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

Khi tôi chạy thử nghiệm này, tôi nhận được lỗi sau:

java.lang.NullPointerException 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:820) 
    at org.unitils.database.transaction.impl.DefaultUnitilsTransactionManager.rollback(DefaultUnitilsTransactionManager.java:157) 
    at org.unitils.database.DatabaseModule.rollbackTransaction(DatabaseModule.java:425) 
    at org.unitils.database.DatabaseModule.endTransactionForTestMethod(DatabaseModule.java:390) 
    at org.unitils.database.DatabaseModule$DatabaseTestListener.afterTestTearDown(DatabaseModule.java:486) 
    at org.unitils.core.Unitils$UnitilsTestListener.afterTestTearDown(Unitils.java:315) 
    at org.unitils.core.junit.AfterTestTearDownStatement.evaluate(AfterTestTearDownStatement.java:48) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.unitils.core.junit.BeforeTestClassStatement.evaluate(BeforeTestClassStatement.java:41) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

Dường như mã kiểm tra thậm chí không đạt được. Tôi đang làm gì sai?

+0

Không một chuyên gia về bất kỳ những techs, nhưng nếu bạn nhìn vào đống dấu vết có vẻ như nếu các cuộc thử nghiệm mong đợi có được một số loại giao dịch quản lý trong một bối cảnh mùa xuân hoàn chỉnh, nhưng điều đó không được thiết lập (không có runner mùa xuân junit). –

+0

hãy nhìn vào dòng thứ hai của bài kiểm tra '@RunWith (UnitilsBlockJUnit4ClassRunner.class)' – dopatraman

+1

Vâng, bạn đã thiết lập một bối cảnh ứng dụng mùa xuân như được mô tả trong http://unitils.sourceforge.net/tutorial-spring.html? –

Trả lời

2

Tôi không thể thêm nhận xét vì số < 50 đại diện. Tôi nghĩ có lẽ điều này sẽ hữu ích.

Rollback transaction after @Test

Nó không được sử dụng Unitils, nhưng dường như là hành vi mà bạn đang tìm kiếm. Unitils dường như đã được cập nhật lần cuối vào năm 2011 (và nghi ngờ của tôi là đó là nơi mà vấn đề của bạn nằm) vì vậy nó có thể là giá trị junking nó.

3

Bạn có hai triển khai cơ sở dữ liệu trong tệp pom.xml của mình mà không chỉ định phạm vi. Mùa xuân không thể đoán được cái nào là cái đúng, do đó là một ngoại lệ.

<dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
    </dependency> 
    [...] 
    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.4-1206-jdbc42</version> 
    </dependency> 

Nhiều khả năng này sẽ giúp bạn thêm: Configure specific in memory database for testing purpose in Spring

Các vấn đề liên quan