日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot中Mockito單元測試入門

瀏覽:129日期:2023-03-07 16:07:51
目錄Mock 測試What’s Mockito使用 Mockitopom依賴Demo Code【常規操作】【Mockito】Mock 測試

Mock 測試就是在測試過程中,創建一個假的對象,避免你為了測試一個方法,卻要自行構建整個 Bean 的依賴鏈。

舉個例子:

類 A 需要調用類 B 和類 C,而類 B 和類 C 又需要調用其他類如 D、E、F 等,假設類 D 是一個外部服務,那就會很難測,因為你的返回結果會直接的受外部服務影響,導致你的單元測試可能今天會過、但明天就過不了了。

SpringBoot中Mockito單元測試入門

而當我們引入 Mock 測試時,就可以創建一個假的對象,替換掉真實的 Bean B 和 C,這樣在調用B、C的方法時,實際上就會去調用這個假的 Mock 對象的方法,而我們就可以自己設定這個 Mock 對象的參數和期望結果,讓我們可以專注在測試當前的類 A,而不會受到其他的外部服務影響,這樣測試效率就能提高很多。

SpringBoot中Mockito單元測試入門

What’s Mockito

Mockito 是一種 Java Mock 框架,主要就是用來做 Mock 測試的,它可以模擬任何 Spring 管理的 Bean、模擬方法的返回值、模擬拋出異常等等,同時也會記錄調用這些模擬方法的參數、調用順序,從而可以校驗出這個 Mock 對象是否有被正確的順序調用,以及按照期望的參數被調用。

像是 Mockito 可以在單元測試中模擬一個 Service 返回的數據,而不會真正去調用該 Service,通過模擬一個假的 Service 對象,來快速的測試當前想要測試的類。

目前在 Java 中主流的 Mock 測試工具有 Mockito、JMock、EasyMock等等,而 SpringBoot 目前默認的測試框架是 Mockito 框架。

使用 Mockitopom依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency>

SpringBoot中Mockito單元測試入門

Demo Code

一個 UserService,兩個方法

getUserById() -------------> 調用 UserDao 這個 bean的 getUserById() insertUser() -------------> 調用 UserDao 這個 bean的 insertUser()

@Componentpublic class UserService {@Autowired private UserDao userDao; public User getUserById(Integer id) {return userDao.getUserById(id); } public Integer insertUser(User user) {return userDao.insertUser(user); }}

【POJO對象】

public class User { private Integer id; private String name; //省略 getter/setter}【常規操作】

如果這時候我們先不使用 Mockito 模擬一個假的 userDao Bean,而是真的去調用一個正常的 Spring Bean 的 userDao 的話, 注入 userService Bean,然后去調用方法,而他會再去調用 userDao 取得數據庫的數據,然后我們再對返回結果做 Assert 斷言檢查。

@RunWith(SpringRunner.class)@SpringBootTestpublic class UserServiceTest { //先普通的注入一個userService bean @Autowired private UserService userService; @Test public void getUserById() throws Exception {//普通的使用userService,他里面會再去調用userDao取得數據庫的數據User user = userService.getUserById(1);//檢查結果Assert.assertNotNull(user);Assert.assertEquals(user.getId(), new Integer(1));Assert.assertEquals(user.getName(), 'John'); }}【Mockito】

但是如果 userDao 還沒寫好,又想先測 userService 的話,就需要使用 Mockito 去模擬一個假的 userDao 出來。

具體怎么搞呢?

在 userDao 上加上一個 @MockBean 注解

當 userDao 被加上這個注解之后,表示 Mockito 會幫我們創建一個假的 Mock 對象,替換掉 Spring 中已存在的那個真實的 userDao Bean,也就是說,注入進 userService 的 userDao Bean,已經被我們替換成假的 Mock 對象了,所以當我們再次調用 userService 的方法時,會去調用的實際上是 mock userDao Bean 的方法,而不是真實的 userDao Bean。

當我們創建了一個假的 userDao 后,我們需要為這個 mock userDao 自定義方法的返回值,這里有一個公式用法,下面這段代碼的意思為,當調用了某個 Mock 對象的方法時,就回傳我們想要的自定義結果。

Mockito.when( 對象.方法名() ).thenReturn( 自定義結果 )

代碼如下:

@RunWith(SpringRunner.class)@SpringBootTestpublicclass UserServiceTest {@Autowired private UserService userService;@MockBean private UserDao userDao; @Test public void getUserById() throws Exception {// 定義當調用mock userDao的getUserById()方法,并且參數為3時,就返回id為200、name為I’m mock3的user對象Mockito.when(userDao.getUserById(3)).thenReturn(new User(200, 'Aritisan'));// 返回的會是名字為I’m mock 3的user對象User user = userService.getUserById(1);Assert.assertNotNull(user);Assert.assertEquals(user.getId(), new Integer(200));Assert.assertEquals(user.getName(), 'Aritisan'); }}

Mockito 除了最基本的 Mockito.when( 對象.方法名() ).thenReturn( 自定義結果 ),還提供了其他用法讓我們使用。

thenReturn

當使用任何整數值調用 userService 的 getUserById() 方法時,就回傳一個名字為Aritisan的 User 對象。

Mockito.when(userService.getUserById(Mockito.anyInt())).thenReturn(new User(3, 'Aritisan'));User user1 = userService.getUserById(3); // 回傳的user的名字為AritisanUser user2 = userService.getUserById(200); // 回傳的user的名字也為Aritisan

限制只有當參數的數字是 3 時,才會回傳名字為 Aritisan 的 user 對象。

Mockito.when(userService.getUserById(3)).thenReturn(new User(3, 'Aritisan'));User user1 = userService.getUserById(3); // 回傳的user的名字為AritisanUser user2 = userService.getUserById(200); // 回傳的user為null

當調用 userService 的 insertUser() 方法時,不管傳進來的 user 是什么,都回傳 100。

Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn(100);Integer i = userService.insertUser(new User()); //會返回100

thenThrow

當調用 userService 的 getUserById() 時的參數是 9 時,拋出一個 RuntimeException。

Mockito.when(userService.getUserById(9)).thenThrow(new RuntimeException('mock throw exception'));User user = userService.getUserById(9); //會拋出一個RuntimeException

如果方法沒有返回值的話(即是方法定義為 public void myMethod() {…}),要改用 doThrow() 拋出 Exception。

Mockito.doThrow(new RuntimeException('mock throw exception')).when(userService).print();userService.print(); //會拋出一個RuntimeException

verify

檢查調用 userService 的 getUserById()、且參數為3的次數是否為1次。

驗證調用順序,驗證 userService 是否先調用 getUserById() 兩次,并且第一次的參數是 3、第二次的參數是 5,然后才調用insertUser() 方法。

InOrder inOrder = Mockito.inOrder(userService);inOrder.verify(userService).getUserById(3);inOrder.verify(userService).getUserById(5);inOrder.verify(userService).insertUser(Mockito.any(User.class));

Mockito 注意事項

上述就是 Mockito 的 Mock 對象使用方法,不過當使用 Mockito 在 Mock 對象時,有一些限制需要遵守:

不能 Mock 靜態方法 不能 Mock private 方法 不能 Mock final class

因此在寫代碼時,需要做良好的功能拆分,才能夠使用 Mockito 的 Mock 技術,幫助我們降低測試時 Bean 的耦合度。

到此這篇關于SpringBoot中Mockito單元測試入門的文章就介紹到這了,更多相關SpringBoot Mockito單元測試 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲网址在线观看| 亚洲精品一级| 日韩av字幕| 日本免费在线视频不卡一不卡二| 少妇精品久久久一区二区| 欧美伊人影院| 久久这里只有| 精品一区二区三区中文字幕在线| 国产成人精品一区二区免费看京| 韩国三级一区| 黄色av一区| 亚洲最新av| 欧美激情五月| 香蕉精品久久| 亚洲精品亚洲人成在线观看| 国产午夜久久av| 91麻豆国产自产在线观看亚洲| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 久久这里只有| 中文字幕系列一区| 丝袜a∨在线一区二区三区不卡| 日韩精品久久久久久| 国产精品www994| 香蕉久久99| 91亚洲无吗| 日韩一区电影| 亚洲三区欧美一区国产二区| 美女久久久精品| 女人av一区| 国产精久久久| 99久久九九| 国产亚洲一区| 激情欧美亚洲| 久久精品99久久久| 成人羞羞在线观看网站| 免费看精品久久片| 精品一区二区三区在线观看视频 | 亚洲乱码久久| 神马久久午夜| 欧美亚洲自偷自偷| 欧美日一区二区| 日韩二区三区在线观看| 精品高清久久| 亚洲五月综合| 电影亚洲精品噜噜在线观看| 日韩高清中文字幕一区| 久久五月天小说| 国产精品v亚洲精品v日韩精品| 欧美日韩国产一区二区三区不卡| 国产精品99精品一区二区三区∴ | 日韩精品电影| 日韩精品欧美大片| 亚洲国产影院| 国内精品美女在线观看| 亚洲精品影视| 亚洲二区三区不卡| 国产资源在线观看入口av| 亚洲精品激情| 五月婷婷亚洲| 日韩电影二区| 麻豆精品蜜桃视频网站| 亚洲精品伊人| 免费观看在线色综合| 亚洲最新无码中文字幕久久| 国产欧美日韩精品高清二区综合区 | 亚洲午夜电影| 精品国产乱码久久久| 日本特黄久久久高潮| 亚洲一区日韩| 久久精品国产99久久| 韩日一区二区| 国产精品三级| 日本午夜精品视频在线观看| 免费日韩av| 不卡中文一二三区| 美女网站视频一区| 精品国产亚洲一区二区三区在线 | 欧美+日本+国产+在线a∨观看| 国产成人精品福利| 国产精品99久久免费观看| 日本一区二区三区视频在线看 | av在线资源| 日韩av自拍| 精品高清久久| 国产一区福利| 精品国产亚洲一区二区三区在线| 久久国产视频网| 日韩精选在线| 日本精品一区二区三区在线观看视频 | 欧美日韩亚洲一区| 青青草国产成人99久久| 亚洲精品国产精品粉嫩| 亚洲毛片视频| 日本电影久久久| 青青草91视频| 久久国内精品自在自线400部| 欧美三区不卡| 国产精品白丝久久av网站| 国产日产精品_国产精品毛片| 日韩欧美中文字幕电影| 天堂va欧美ⅴa亚洲va一国产| 日韩精品福利一区二区三区| 日韩动漫一区| 免费一级欧美片在线观看网站 | 亚洲日本国产| 日韩二区三区在线观看| 欧美日韩国产一区二区在线观看| 国产视频一区二区在线播放| 青草久久视频| 久久精品一本| 成人精品中文字幕| 欧美日韩视频| 亚洲免费一区三区| 国产欧美日韩精品一区二区免费| 精品一区二区三区亚洲| 国产中文在线播放| 99久久www免费| 欧美综合二区| 久久国产精品免费一区二区三区| 精品一区二区三区在线观看视频| а√在线中文在线新版| 91精品久久久久久久久久不卡| 2023国产精品久久久精品双| 尤物精品在线| 欧美日本不卡| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美亚洲激情| 亚洲精品裸体| 精品视频一区二区三区在线观看 | 日韩大片在线播放| 一区二区视频欧美| 欧美一区91| 成人免费电影网址| 亚洲精品乱码| 成人在线免费观看91| 欧美精品高清| 亚洲一区日本| 麻豆久久一区二区| 激情婷婷综合| 国产日韩高清一区二区三区在线 | 首页国产欧美久久| 国产精品视频一区二区三区综合| 蜜臀久久精品| 亚洲视频国产| 国产a亚洲精品| 视频一区在线视频| 国产福利亚洲| 国产精品普通话对白| 久久av导航| 尹人成人综合网| 国产精品黄色片| 亚洲精品99| 国产精品大片免费观看| 欧美另类专区| 免费在线日韩av| 视频在线观看一区二区三区| 久久久国产精品网站| 中文一区在线| 久久久精品区| 午夜在线视频观看日韩17c| 精品久久福利| 亚洲久久视频| 欧美中文字幕一区二区| 国产精品香蕉| 亚洲欧美日韩精品一区二区 | 日韩国产欧美在线播放| 久久中文字幕av| 国产精品22p| 亚洲精品激情| 天堂资源在线亚洲| 成人午夜在线| 青草久久视频| 欧美日韩三区| 成人精品亚洲| 色婷婷综合网| 国产精品115| 日本久久一区| 亚洲综合中文| 亚洲少妇在线| 性欧美xxxx免费岛国不卡电影| 国产一区三区在线播放| 国产精品分类| 欧美日韩 国产精品| 亚洲精品少妇| 快she精品国产999| 亚洲香蕉网站| 中文字幕在线看片| 久久国产精品色av免费看| 亚洲综合专区| 鲁大师影院一区二区三区| 国产国产精品| 国产中文一区| 99成人超碰| 久久91导航| 日韩免费小视频| 日韩不卡免费高清视频| 岛国av免费在线观看| 国产 日韩 欧美 综合 一区 | 亚洲91在线| 亚洲综合福利|