成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

小白搞 Spring Boot 單元測試

開發 架構
進行過JavaWeb開發的同學都了解,在進行后臺開發時不僅需要完成系統功能的開發,為了保證系統的健壯性還要同步編寫對應的單元測試類。

[[420921]]

大家好,我是田維常,今天給大家分享來自于一位小伙的投稿。

內容是:Spring Boot 中的單元測

前言

何為單元測試

單元測試的目的: 測試當前所寫的代碼是否是正確的, 例如輸入一組數據, 會輸出期望的數據; 輸入錯誤數據, 會產生錯誤異常等. 在單元測試中, 我們需要保證被測系統是獨立的(SUT 沒有任何的 DOC), 即當被測系統通過測試時, 那么它在任何環境下都是能夠正常工作的. 編寫單元測試時, 僅僅需要關注單個類就可以了. 而不需要關注例如數據庫服務, Web 服務等組件。

背景

進行過JavaWeb開發的同學都了解,在進行后臺開發時不僅需要完成系統功能的開發,為了保證系統的健壯性還要同步編寫對應的單元測試類。基于Spring Boot開發的項目中的test包用于存放單元測試類,同時也提供了對應的注解來進行單元測試的編寫,本文結合Mock對Spring Boot中的單元測試進行總結。

環境:JDK1.8+、Spring Boot、mockito。

單元測試的引入

在Spring Boot中引入單元測試只需在pom文件中加入如下依賴,其中提供了JUnit、SpringBoot Test等常見單元測試庫。

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-test</artifactId> 
  4.     <scope>test</scope> 
  5. </dependency> 
  6. <dependency> 
  7.     <groupId>org.mockito</groupId> 
  8.     <artifactId>mockito-core</artifactId> 
  9.     <version>2.0.111-beta</version> 
  10. </dependency> 

單元測試的創建

每個單元測試類對應項目中的一個程序類,每個單元測試方法對應程序類中的一個方法,為保證所測試方法的正確性,至少需要設計四個以上的測試用例,包含:正確用例、錯誤用例和邊界用例。編寫的注釋事項如下:

  • 測試類的位置位于項目test包下,包的層級結構與項目相同;
  • 測試類的命名規則通常為 xxxTest.java,其中xxx表示待測試類名;
  • 測試類中方法命名規則為testXxx,其中Xxx表示待測試方法名 ;
  • 測試方法上加上注解 @Test;

話不多說,咱們直接開干。

常用注解

當下是注解盛行時代,我們先來了解一下相關的幾個注解。

注解 說明
@RunWith 更改測試運行器 ,   缺省值org.junit.runner.Runner
@Before 初始化方法,執行當前測試類的每個測試方法前執行
@Test 測試方法,在這里可以測試期望異常和超時時間
@Test(timeout = 10000) 超時測試方法,若測試方法未在指定時間內結束則junit自動將其標記為失敗
@Transactional 聲明式事務管理,用于需數據庫事務管理的測試方法
@Rollback(true) 數據庫回滾,避免測試數據污染數據庫

相關理論和技術點,現在已經鋪墊完成,下面,我們使用代碼來實現。

代碼實現

我們分別做三層的測試:controller、service、dao

Service層測試

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest(classes = Application.class) 
  3. public class UserServiceTest { 
  4.  
  5.     @Autowired 
  6.     private UserService userService; 
  7.  
  8.     /** 
  9.      * 測試獲取用戶 
  10.      */ 
  11.     @Test(timeOut = 300000) 
  12.     @Transactional 
  13.     public void testGetUser() { 
  14.         UserEntity userEntity = userService.findByName("zhangSan"); 
  15.         Assert.assertNotNull(userEntity); 
  16.         Assert.assertEquals("zhangSan", userEntity.getName()); 
  17.     } 

是不是很簡單呢?

Controller層測

controller層,也可以稱之為網絡請求測試。對于網絡請求進行測試的情形多見于應用的Controller層。Spring測試框架提供MockMvc對象,可以在不需要客戶端-服務端請求的情況下進行Web測試.

測試開始之前需要建立測試環境,setup方法被@Before修飾。通過MockMvcBuilders工具,創建一個MockMvc對象。

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest(classes = Application.class) 
  3. class UserControllerTest { 
  4.  
  5.     @Autowired 
  6.     private UserController userController ; 
  7.     @Autowired 
  8.     private WebApplicationContext context; 
  9.     private MockMvc mockMvc; 
  10.  
  11.     @Before 
  12.     public void setup(){ 
  13.         mockMvc = MockMvcBuilders.standaloneSetup(userController).build; 
  14.     } 
  15.  
  16.     /** 
  17.      * 獲取用戶列表 
  18.      */ 
  19.     @Test(timeOut = 300000) 
  20.     public void testGetUserList() throws Exception { 
  21.         String url = "/user/getUserList"
  22.         MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get(url)) 
  23.                 .andExpect(MockMvcResultMatchers.status().isOk()).andReturn(); 
  24.         Assert.assertNotNull(mvcResult); 
  25.     } 

DAO層測試

由于DAO層的方法直接操作數據庫,為避免測試數據對數據庫造成污染,使用注解@Transactional和@Rollback在測試完成后對測試數據進行回滾。

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest 
  3. public class ScoreControllerTestNew { 
  4.  
  5.     @Autowired 
  6.     private UserDao userDao; 
  7.  
  8.     /** 
  9.      * 測試插入數據 
  10.      */ 
  11.     @Test 
  12.     @Rollback(value = true
  13.     @Transactional 
  14.     public void testInsert() { 
  15.         User userZhang = new User(); 
  16.         userZhang.setName("zhangSan"); 
  17.         userZhang.setAge(23); 
  18.         userZhang.setGender(0); 
  19.         userZhang.setEmail("123@test.com"); 
  20.         int n = userDao.insert(userZhang); 
  21.         Assert.assertEquals(1, n); 
  22.     } 

到此,關于三個層面的測試就已經搞定了,下面我們來看看,如何使用Mockito模擬數據庫操作。

使用Mockito模擬數據庫操作

前面在介紹web請求測試時使用了Mock技術,該技術常用于被測試模塊(方法)依賴于外部系統(web服務、中間件或是數據庫)時。

Mock 的中文譯為仿制的,模擬的,虛假的。對于測試框架來說,即構造出一個模擬/虛假的對象,使我們的測試能順利進行下去。

Mockito 是當前最流行的 單元測試 Mock 框架。采用 Mock 框架,我們可以 虛擬 出一個 外部依賴,降低測試 組件 之間的 耦合度,只注重代碼的 流程與結果,真正地實現測試目的。

由于web服務或數據庫不可達時,可以對其進行Mock,在測試時不需要真實的模塊也可完成測試。

常用的Mockito方法如下:

方法 簡介
Mockito.mock(classToMock) 模擬對象
Mockito.when(methodCall).thenReturn(value) 參數匹配
Mockito.doReturn(toBeReturned).when(mock).[method] 參數匹配(直接執行不判斷)
Mockito.when(methodCall).thenAnswer(answer)) 預期回調接口生成期望值
Mockito.doNothing().when(mock).[method] 不做任何返回

在使用Mockito對DAO層的單元測試進行模擬后,得到的新的單元測試類如下 :

  1. @RunWith(SpringRunner.class) 
  2. public class UserDaoTest { 
  3.     @MockBean 
  4.     private UserDao userDao; 
  5.  
  6.     private User userZhang = new User(); 
  7.     userZhang.setName("zhangSan"); 
  8.     userZhang.setAge(23); 
  9.  
  10.     @Before 
  11.     public void setup() { 
  12.         Mockito.when(userDao.findByName("zhangSan")).willReturn(userZhang); 
  13.         Mockito.when(userDao.findByName("liSi")).willReturn(null); 
  14.     } 
  15.  
  16.     @Test 
  17.     public void testGetUser() { 
  18.         Assert.assertEquals(userZhang, userDao.findByName("zhangSan")); 
  19.         Assert.assertEquals(null, userDao.findByName("liSi")); 
  20.     } 

關于mockito相關,請參考官網:https://site.mockito.org/

后記 

本文重在用代碼案例講解單元測試,篇幅有限,先分享到這里,如有不當之處,敬請諒解指出。

本文轉載自微信公眾號「Java后端技術全棧」,可以通過以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2025-06-12 03:10:00

2023-09-27 23:43:51

單元測試Spring

2021-01-07 14:06:30

Spring BootJUnit5Java

2013-06-04 09:49:04

Spring單元測試軟件測試

2017-01-14 23:42:49

單元測試框架軟件測試

2021-08-26 11:00:54

Spring BootJUnit5Java

2017-01-14 23:26:17

單元測試JUnit測試

2017-01-16 12:12:29

單元測試JUnit

2020-08-18 08:10:02

單元測試Java

2020-07-21 14:40:45

Spring Boot單元測試Java

2021-05-05 11:38:40

TestNGPowerMock單元測試

2017-03-23 16:02:10

Mock技術單元測試

2011-07-04 18:16:42

單元測試

2020-05-07 17:30:49

開發iOS技術

2023-07-26 08:58:45

Golang單元測試

2021-04-23 07:33:10

SpringSecurity單元

2011-05-16 16:52:09

單元測試徹底測試

2017-02-23 15:59:53

測試MockSetup

2011-04-18 13:20:40

單元測試軟件測試

2012-05-17 09:09:05

Titanium單元測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线观看第一页 | 欧美一二区 | 国产精品久久久久久久免费大片 | 国产精品区一区二区三 | 91精品国产91久久久久久密臀 | 午夜精品久久久久99蜜 | 久久久久久九九九九 | 精品久久久久久久久久久久久久久久久 | 538在线精品 | 精品一区二区电影 | 国产清纯白嫩初高生在线播放视频 | 99国产精品久久久 | 午夜精品久久久久久久久久久久 | 国产日韩欧美一区二区 | 婷婷不卡 | 成人一级毛片 | 久草新在线 | 一区二区视屏 | 国产欧美日韩精品一区 | 国产成人精品一区二区在线 | 一级毛片免费视频 | 国产精品成人在线观看 | 成人欧美一区二区三区在线播放 | 最新国产精品 | 1000部精品久久久久久久久 | 国产丝袜一区二区三区免费视频 | 欧美又大粗又爽又黄大片视频 | 亚洲午夜精品 | 精品国产欧美一区二区三区成人 | 亚洲一区视频 | av网站免费看 | 国产精品视屏 | 久久男人 | 国产精品91视频 | 女人精96xxx免费网站p | 欧美大片一区二区 | av一级毛片 | 不卡欧美 | 在线国产一区二区 | 少妇诱惑av | 中文字幕高清一区 |