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

简介: springboot整合H2内存数据库,实现单元测试与数据库无关性 一、新建spring boot工程 新建工程的时候,需要加入JPA,H2依赖 二、工程结构 pom文件依赖如下: [html] view plain copy <?xml version="1.

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

一、新建spring boot工程

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

二、工程结构

pom文件依赖如下:

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <groupId>com.chhliu.springboot.h2</groupId>
  6.     <artifactId>springboot-h2</artifactId>
  7.     <version>0.0.1-SNAPSHOT</version>
  8.     <packaging>jar</packaging>
  9.     <name>springboot-h2</name>
  10.     <description>Demo project for Spring Boot H2</description>
  11.     <parent>
  12.         <groupId>org.springframework.boot</groupId>
  13.         <artifactId>spring-boot-starter-parent</artifactId>
  14.         <version>1.4.3.RELEASE</version>
  15.         <relativePath/> <!-- lookup parent from repository -->
  16.     </parent>
  17.     <properties>
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  20.         <java.version>1.7</java.version>
  21.     </properties>
  22.     <dependencies>
  23.         <dependency>
  24.             <groupId>org.springframework.boot</groupId>
  25.             <artifactId>spring-boot-starter-data-jpa</artifactId>
  26.         </dependency>
  27.         <dependency>
  28.             <groupId>org.springframework.boot</groupId>
  29.             <artifactId>spring-boot-starter-web</artifactId>
  30.         </dependency>
  31.         <dependency>
  32.             <groupId>com.h2database</groupId>
  33.             <artifactId>h2</artifactId>
  34.             <scope>runtime</scope>
  35.         </dependency>
  36.         <dependency>
  37.             <groupId>org.springframework.boot</groupId>
  38.             <artifactId>spring-boot-starter-test</artifactId>
  39.             <scope>test</scope>
  40.         </dependency>
  41.     </dependencies>
  42.     <build>
  43.         <plugins>
  44.             <plugin>
  45.                 <groupId>org.springframework.boot</groupId>
  46.                 <artifactId>spring-boot-maven-plugin</artifactId>
  47.             </plugin>
  48.         </plugins>
  49.     </build>
  50. </project>

三、编写实体类

[java] view plain copy

  1. package com.chhliu.springboot.h2.entity;
  2. import java.math.BigDecimal;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.GenerationType;
  7. import javax.persistence.Id;
  8. @Entity
  9. public class User {
  10.   @Id
  11.   @GeneratedValue(strategy = GenerationType.AUTO)
  12.   private Long id;
  13.   @Column
  14.   private String username;
  15.   @Column
  16.   private String name;
  17.   @Column
  18.   private Short age;
  19.   @Column
  20.   private BigDecimal balance;
  21.   ……省略gettter和setter方法
  22. }

四、编写dao

[java] view plain copy

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

五、编写controller

[java] view plain copy

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

六、配置文件

[java] view plain copy

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

七、启动程序

在浏览器中输入如下URL:

[java] view plain copy

  1. http://localhost:7900/user/4

可以看到测试结果

[java] view plain copy

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

说明,我们的整合是OK的

八、测试dao层

[java] view plain copy

  1. package com.chhliu.springboot.h2;
  2. import org.junit.Assert;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. import com.chhliu.springboot.h2.entity.User;
  9. import com.chhliu.springboot.h2.repository.UserRepository;
  10. @RunWith(SpringRunner.class)
  11. @SpringBootTest
  12. public class SpringbootH2ApplicationTests {
  13.     @Autowired
  14.     private UserRepository repository;
  15.     @Test
  16.     public void test(){
  17.         User u = repository.findOne(1L);
  18.         Assert.assertEquals("成功的测试用例""张三", u.getName());
  19.     }
  20. }

发现测试是ok的!

九、总结

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

相关文章
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
48 3
SpringBoot入门 - 添加内存数据库H2
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
54 4
SpringBoot入门(4) - 添加内存数据库H2
|
3天前
|
运维 监控 Java
为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
本文记录并复盘了生产环境中Spring Boot应用内存占用过高的问题及解决过程。系统上线初期运行正常,但随着业务量上升,多个Spring Boot应用共占用了64G内存中的大部分,导致应用假死。通过jps和jmap工具排查发现,原因是运维人员未设置JVM参数,导致默认配置下每个应用占用近12G内存。最终通过调整JVM参数、优化堆内存大小等措施解决了问题。建议在生产环境中合理设置JVM参数,避免资源浪费和性能问题。
19 3
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
37 2
SpringBoot入门(4) - 添加内存数据库H2
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
34 1
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
70 13
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
51 4
|
3月前
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (三):数据库
本文介绍了在 Flask 应用中实现权限管理的过程,包括使用 Flask-SQLAlchemy、Flask-MySQLdb、Flask-Security 和 Flask-Login 等扩展模块进行数据库配置与用户权限设置。首先创建数据库并定义用户、环境和角色模型,接着通过 Flask-Security 初始化用户和角色,并展示了如何便捷地管理权限。后续将深入探讨权限控制的具体应用。
84 4
测试开发之路--Flask 之旅 (三):数据库
|
3月前
|
关系型数据库 MySQL 数据库
6-2|测试连接数据库的命令
6-2|测试连接数据库的命令
|
2月前
|
SQL JSON 缓存
你了解 SpringBoot 在一次 http 请求中耗费了多少内存吗?
在工作中常需进行全链路压测并优化JVM参数。通过实验可精确计算特定并发下所需的堆内存,并结合JVM新生代大小估算GC频率,进而优化系统。实验基于SpringBoot应用,利用JMeter模拟并发请求,分析GC日志得出:单次HTTP请求平均消耗约34KB堆内存。复杂环境下,如公司线上环境,单次RPC请求内存消耗可达0.5MB至1MB,揭示了高并发场景下的内存管理挑战。

热门文章

最新文章