美文网首页Java学习笔记Java 杂谈互联网科技
springboot整合H2内存数据库,实现单元测试与数据库无关

springboot整合H2内存数据库,实现单元测试与数据库无关

作者: Java工程师攻略 | 来源:发表于2019-04-09 17:13 被阅读3次

    一、新建spring boot工程

    image.png 新建工程的时候,需要加入JPA,H2依赖

    二、工程结构

    image.png pom文件依赖如下:
    
    <?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.chhliu.springboot.h2</groupId>
        <artifactId>springboot-h2</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
     
        <name>springboot-h2</name>
        <description>Demo project for Spring Boot H2</description>
     
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
     
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.7</java.version>
        </properties>
     
        <dependencies>
            <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>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
     
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    三、编写实体类

    package com.chhliu.springboot.h2.entity;
     
    import java.math.BigDecimal;
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
     
    @Entity
    public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
     
      @Column
      private String username;
     
      @Column
      private String name;
     
      @Column
      private Short age;
     
      @Column
      private BigDecimal balance;
     
      ……省略gettter和setter方法
    }
    

    四、编写dao

    
    package com.chhliu.springboot.h2.repository;
     
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
     
    import com.chhliu.springboot.h2.entity.User;
     
    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
     
    }
    

    五、编写controller

    
    package com.chhliu.springboot.h2.controller;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.chhliu.springboot.h2.entity.User;
    import com.chhliu.springboot.h2.repository.UserRepository;
     
    @RestController
    public class UserController {
     
      @Autowired
      private UserRepository userRepository;
     
      @GetMapping("/user/{id}")// 注意,此处使用的是GetMapping注解,该注解的作用类似与@RequestMapping(value="/user/{id}" ,method=RequestMethod.GET),@PostMapping注解同理
      public User findById(@PathVariable Long id) {
        return this.userRepository.findOne(id);
      }
    }
    

    六、配置文件

    # 服务器端口号
    server.port=7900
    # 是否生成ddl语句
    spring.jpa.generate-ddl=false
    # 是否打印sql语句
    spring.jpa.show-sql=true
    # 自动生成ddl,由于指定了具体的ddl,此处设置为none
    spring.jpa.hibernate.ddl-auto=none
    # 使用H2数据库
    spring.datasource.platform=h2
    # 指定生成数据库的schema文件位置
    spring.datasource.schema=classpath:schema.sql
    # 指定插入数据库语句的脚本位置
    spring.datasource.data=classpath:data.sql
    # 配置日志打印信息
    logging.level.root=INFO
    logging.level.org.hibernate=INFO
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    logging.level.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE
    logging.level.com.itmuch=DEBUG
    

    七、启动程序

    在浏览器中输入如下URL:

    http://localhost:7900/user/4
    

    可以看到测试结果

    {"id":4,"username":"user4","name":"马六","age":20,"balance":100.00}
    

    说明,我们的整合是OK的

    八、测试dao层

    package com.chhliu.springboot.h2;
     
    import org.junit.Assert;
    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;
     
    import com.chhliu.springboot.h2.entity.User;
    import com.chhliu.springboot.h2.repository.UserRepository;
     
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootH2ApplicationTests {
     
        @Autowired
        private UserRepository repository;
        
        @Test
        public void test(){
            User u = repository.findOne(1L);
            Assert.assertEquals("成功的测试用例", "张三", u.getName());
        }
    }
    

    发现测试是ok的!

    九、总结

    由于H2是关系内存数据库,当程序启动的时候,会在内存中创建表,并将数据存储在内存中,当重启程序后,会自动删除内存中的数据,从而可以很好的用来做dao层的单元测试和service层的单元测试,使整个程序不会依赖具体的数据库,同时也提高了单元测试的效率。

    相关文章

      网友评论

        本文标题:springboot整合H2内存数据库,实现单元测试与数据库无关

        本文链接:https://www.haomeiwen.com/subject/gkkiiqtx.html