1. 程式人生 > >Java後臺框架篇--Spring單元測試中的H2資料庫

Java後臺框架篇--Spring單元測試中的H2資料庫

H2資料庫是一種由Java編寫的,極小,速度極快,可嵌入式的資料庫。非常適合用在單元測試等資料不需要儲存的場景下面。
以下時其官網的介紹:
{% blockquote h2 http://www.h2database.com/html/main.html h2 %}
Welcome to H2, the Java SQL database. The main features of H2 are:
Very fast, open source, JDBC API
Embedded and server modes; in-memory databases
Browser based Console application


Small footprint: around 1.5 MB jar file size
{% endblockquote %}

spring-data直連測試

我們使用的maven工程來搭建測試環境,工程目錄如下:

程式碼裡面資料庫對映使用了spring-data 和 Hibernate實現,方便實現,避免自己寫sql。

資料連線配置資訊

jdbc.driver=net.sf.log4jdbc.DriverSpy
jdbc.url=jdbc:log4jdbc:h2:mem:test;MODE=MySql;DB_CLOSE_DELAY=-1
jdbc.username=sa
jdbc.password=

引數解析:

  1. driver這裡我用的時log4jdbc這個專案,可以方便的打印出帶全部引數的sql
  2. jdbc:h2:mem 意思使用h2的記憶體資料庫版本,還可以有file等各種方式
  3. test連線的資料庫名稱
  4. MODE=MySql 以mysql的模式執行
  5. DB_CLOSE_DELAY=-1 關閉引數,延時關閉為程式碼退出時間。

測試用例:

    @Test
    publicvoidtestFindAll() {
        List<User> list = (List<User>) userDao.findAll();
        for (User user : list) {
            System.out
.println(user.toString()); } }

執行結果:

17:45:37.582 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executing SQL script from class path resource [db/sql/schema.sql]
17:45:37.587 [main] INFO  jdbc.sqltiming - DROP TABLE IF EXISTS sys_user
 {executed in 0 msec}
17:45:37.593 [main] INFO  jdbc.sqltiming - CREATE TABLE sys_user ( id BIGINT NOT NULL, name VARCHAR(255), PRIMARY KEY (id) )
 {executed in 5 msec}
17:45:37.594 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executed SQL script from class path resource [db/sql/schema.sql] in 10 ms.
17:45:37.594 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executing SQL script from class path resource [db/sql/import-data.sql]
17:45:37.596 [main] INFO  jdbc.sqltiming - INSERT INTO sys_user (id, name) VALUES (1111, '張三')
 {executed in 1 msec}
17:45:37.597 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executed SQL script from class path resource [db/sql/import-data.sql] in 3 ms.
17:45:37.598 [main] INFO  jdbc.connection - 2. Connection closed
17:45:37.756 [main] INFO  jdbc.connection - 3. Connection opened
17:45:37.758 [main] INFO  o.s.t.c.t.TransactionContext - Began transaction (1) for test context [[email protected] testClass = UserDaoTest, testInstance = [email protected]6482eef, testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected]2ab2710 testClass = UserDaoTest, locations = '{classpath:/applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{test}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager[email protected]]; rollback [true]
17:45:37.879 [main] INFO  jdbc.sqltiming - select user0_.id as id1_0_, user0_.name as name2_0_ from sys_user user0_
 {executed in 0 msec}
User{id=1111, name='張三'}
17:45:37.906 [main] INFO  jdbc.connection - 3. Connection closed

測試通過,H2搭建測試環境成功。

新增schema

2.0版本新增資料庫跨庫查詢;

@Entity
@Table(name = "sys_user",schema = "sys")
public class User implements Serializable {
    private Long id;
    private String name;
    //省略getter和setter方法
}

sql同時也要修改為:

CREATE SCHEMA IF NOT EXISTS sys;

DROP TABLE IF EXISTS sys.sys_user;

CREATE TABLE sys.sys_user (
  id   BIGINT NOT NULL,
  name VARCHAR(255),
  PRIMARY KEY (id)
)

INSERT INTO sys.sys_user (id, name) VALUES (1111, '張三');

jdbc連線的url不變。
執行測試用例,結果完全一致:

17:56:58.160 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executing SQL script from class path resource [db/sql/schema.sql]
17:56:58.165 [main] INFO  jdbc.sqltiming - CREATE SCHEMA IF NOT EXISTS sys
 {executed in 0 msec}
17:56:58.165 [main] INFO  jdbc.sqltiming - DROP TABLE IF EXISTS sys.sys_user
 {executed in 0 msec}
17:56:58.170 [main] INFO  jdbc.sqltiming - CREATE TABLE sys.sys_user ( id BIGINT NOT NULL, name VARCHAR(255), PRIMARY KEY (id) )
 {executed in 4 msec}
17:56:58.170 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executed SQL script from class path resource [db/sql/schema.sql] in 10 ms.
17:56:58.170 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executing SQL script from class path resource [db/sql/import-data.sql]
17:56:58.172 [main] INFO  jdbc.sqltiming - INSERT INTO sys.sys_user (id, name) VALUES (1111, '張三')
 {executed in 1 msec}
17:56:58.172 [main] INFO  o.s.jdbc.datasource.init.ScriptUtils - Executed SQL script from class path resource [db/sql/import-data.sql] in 2 ms.
17:56:58.318 [main] INFO  o.s.t.c.t.TransactionContext - Began transaction (1) for test context [[email protected] testClass = UserDaoTest, testInstance = [email protected]6482eef, testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected]2ab2710 testClass = UserDaoTest, locations = '{classpath:/applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{test}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [[email protected]]; rollback [true]
17:56:58.431 [main] INFO  jdbc.sqltiming - select user0_.id as id1_0_, user0_.name as name2_0_ from sys.sys_user user0_
 {executed in 1 msec}
User{id=1111, name='張三'}
17:56:58.451 [main] INFO  jdbc.connection - 3. Connection closed

schema新增後,只需要將對應的建立表和語句對應修改即可。

相關推薦

Java後臺框架--Spring單元測試H2資料庫

H2資料庫是一種由Java編寫的,極小,速度極快,可嵌入式的資料庫。非常適合用在單元測試等資料不需要儲存的場景下面。 以下時其官網的介紹: {% blockquote h2 http://www.h2database.com/html/main.html h2 %}Wel

Java後臺框架--Spring與Restful風格API介面開發

Restful風格的API是一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器互動類的軟體。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。 在Restful風格中,使用者請求的url使用同一個url而用請求方式:get,post,

Java後臺框架--Spring的三種配置方式

1、Explicit configuration in XML:顯示的XML配置。      優點:      1)XML配置方式進一步降低了耦合,使得應用更加容易擴充套件,即使對配置檔案進一步修改也不需要工程進行修改和重新編譯。      2)在處理大的業務量的時候,用X

Java後臺框架--spring websocket 和stomp實現訊息功能

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <html> <head> <title>Home</title> <spring:

Java後臺框架--Spring之快取

public class TestCache { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("config/spr

Java後臺框架--Spring的AOP實現原理

Spring的AOP實現原理,醞釀了一些日子,寫部落格之前信心不是很足,所以重新閱讀了一邊AOP的實現核心程式碼,而且又從網上找了一些Spring Aop剖析的例子,但是發現掛羊頭買狗肉的太多,標題高大上,內容卻大部分都是比較淺顯的一些介紹,可能也是由於比較少人閱讀這

Java後臺框架--Spring之WebService入門

前置技能 這個技能必須點一級,以便快速配置專案。 本文實際上是我學習Spring的過程中搬的官網上的demo,使用maven配置專案。 ② jdk 1.8+   該服務demo需要在jdk1.8+的環境下執行 新建專案,配置依賴檔案 ① 安裝好eclipse

.NET Core之單元測試(二):使用記憶體資料庫處理單元測試資料庫依賴

目錄 定義一個待測試API 測試用例 為減少篇幅,隱藏了SampleEntity和SqliteDbContext 定義一個待測試API 如下,我們定義了一個名為Sample的API,其中有一個外部依賴項Sqli

Java從入門到放棄》JavaSE入門單元測試

java 單元測試 單元測試其實沒什麽好說的,直接看操作步驟!我們來測試前一篇的小明買食物的方法。第一步:在小明類上點右鍵,然後再new一個JUnit Test Case第二步:繼續點下一步,圖上的內容相信大家都看得懂吧,如果看不懂···,那就要麽學習,要麽放棄吧,哈哈!第三步:勾選要測試的方法:第四

Java 後臺框架源碼 springmvc spring mybatis SSM 有代碼生成器

springmvc 框架 源碼 ehcache mybatis 官網 http://www.fhadmin.org/A代碼編輯器,在線模版編輯,仿開發工具編輯器,pdf在線預覽,文件轉換編碼B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器 fr

java框架---spring aop兩種配置方式

system 操作類 asp xml文件 ack ica one pack exc 第一種:註解配置AOP 註解配置AOP(使用 AspectJ 類庫實現的),大致分為三步: 1. 使用註解@Aspect來定義一個切面,在切面中定義切入點(@Pointcut),通知類型(@

java~springboot~h2數據庫在單元測試的使用

存儲 會同 oot 直接 context user get pil runner 單元測試有幾點要說的 事實上springboot框架是一個tdd框架,你在進行建立項目時它會同時建立一個單元測試項目,而我們的代碼用例可以在這個項目裏完成,對於單元測試大叔有以下幾點需要說明一

Python單元測試模組Unittest快速入門 unittest單元測試框架總結 Python單元測試unittest Python3 unittest斷言詳解 Python3 unittest單元測試 Python HTMLTestRunner 學習

前言 為什麼需要單元測試? 如果沒有單元測試,我們會遇到這種情況:已有的健康執行的程式碼在經過改動之後,我們無法得知改動之後是否引入了Bug。如果有單元測試的話,只要單元測試全部通過,我們就可以保證沒有Bug被引入。因此,單元測試是保證軟體工程質量的一個很重要的方面。 Python中的單元測試 Pyt

java面試題框架spring cloud之服務發現consul

1.服務發現 spring cloud提供了多個服務發現框架整合,euerka已經停止開發了,目前最流行的是consul Feature euerka Consul zookeeper etcd 服務健康檢查 可配支援 服務狀態,記

Spring MVC+Mybatis框架實現Junit4單元測試

作為程式設計師,我們自己在寫完程式的時候應該先做完單元測試,確認無誤以後才把程式碼提交到公司公共的系統裡面去,這樣做其實也有利於提高自己的能力,這裡做了個簡單的單元測試案列寫法。 上程式碼: /** * 配置Spring與junit4整合,junit啟動時載入sprin

[Java面試]二:常見面試題之框架Spring MVC

什麼是Spring MVC 1Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動型別的輕量級Web框架。使用了MVC架構模式的思想,將web層進行職責解耦

Java單元測試和整合spring單元測試

在我們編寫專案過程中,經常會需要進行程式碼測試,那是不是在編寫一個main方法之後,然後編寫各種的測試程式碼。這樣做,顯然是不合適的也是很不專業的。那怎麼辦呢?今天我們來聊下junit(單元測試)。        為了後期測試基於spring的單元測試,我們直接新建spri

java單元測試setUp方法和setUpBeforeClass方法的區別

今天寫了一個類,向檔案中寫入內容。但是單元測試時,檢視檔案,發現要寫的內容在檔案中總是重複好幾次。而且重複的次數正好和要測試的方法的次數相等。就想到問題出在setUp方法上,google了一下,發現setUp方法原來是

java單元測試修改系統時間

參考文章: Java8的DateTimeFormatter是執行緒安全的,而SimpleDateFormat並不是執行緒安全 import java.time.Clock; import java.time.LocalDateTime; import

spring框架_03 junit單元測試

 單元測試不是頭一次聽說了,但只是聽說從來沒有用過。一個模組怎麼測試呢,是不是得專門為一單元寫一個測試程式,然後將測試單元程式碼拿過來測試? 我是這麼想的。學到spring框架這才知道單元測試原來是這麼回事兒。  下面以上一篇文章中set注入的第一個例項為測試物件。進