日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mockito mock void方法_使用 Junit + Mockito 实践单元测试!

發(fā)布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mockito mock void方法_使用 Junit + Mockito 实践单元测试! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

相信做過開發(fā)的同學(xué),都多多少少寫過下面的代碼,很長一段時間我一直以為這就是單元測試...

@SpringBootTest

@RunWith(SpringRunner.class)

public class UnitTest1 {

? ? @Autowired

? ? private UnitService unitService;

? ? @Test

? ? public void test() {

? ? ? ? System.out.println("----------------------");

? ? ? ? System.out.println(unitService.sayHello());

? ? ? ? System.out.println("----------------------");

? ? }

}

但這是單元測試嘛?unitService 中可能還依賴了 Dao 的操作;如果是微服務(wù),可能還要起注冊中心。那么這個“單元”也太大了吧!如果把它稱為集成測試,可能更恰當一點,那么有沒有可能最小粒度進行單元測試嘛?

單元測試應(yīng)該是一個帶有隔離性的功能測試。在單元測試中,應(yīng)盡量避免其他類或系統(tǒng)的副作用影響。

單元測試的目標是一小段代碼,例如方法或類。方法或類的外部依賴關(guān)系應(yīng)從單元測試中移除,而改為測試框架創(chuàng)建的 mock 對象來替換依賴對象。

單元測試一般由開發(fā)人員編寫,通過驗證或斷言目標的一些行為或狀態(tài)來達到測試的目的。

二、JUnit 框架

JUnit 是一個測試框架,它使用注解來標識測試方法。JUnit 是 Github 上托管的一個開源項目。

一個 JUnit 測試指的是一個包含在測試類中的方法,要定義某個方法為測試方法,請使用 @Test 注解標注該方法。該方法執(zhí)行被測代碼,可以使用 JUnit 或另一個 Assert 框架提供的 assert 方法來檢查預(yù)期結(jié)果與實際結(jié)果是否一致,這些方法調(diào)用通常稱為斷言或斷言語句。

public class UnitTest2 {

? ? @Test

? ? public void test() {

? ? ? ? String sayHello = "Hello World";

? ? ? ? Assert.assertEquals("Hello World", sayHello);

? ? }

}

以下是一些常用的 JUnit 注解:

以下是一些常用的 Assert 斷言:

三、Mockito 框架

從上面的介紹我們可以認識到,如何減少對外部的依賴才是實踐單元測試的關(guān)鍵。而這正是 Mockito 的使命,Mockito 是一個流行的 mock 框架,可以與 JUnit 結(jié)合使用,Mockito 允許我們創(chuàng)建和配置 mock 對象,使用 Mockito 將大大簡化了具有外部依賴項的類的測試開發(fā)。spring-boot-starter-test 中默認集成了 Mockito,不需要額外引入。

在測試中使用 Mockito,通常會:

  • mock 外部依賴關(guān)系并將 mock 對象插入待測代碼

  • 執(zhí)行被測代碼

  • 驗證代碼是否正確執(zhí)行

3.1 使用 Mockito 創(chuàng)建 mock 對象

Mockit o提供了幾種創(chuàng)建 mock 對象的方法:

  • 使用靜態(tài) mock() 方法

  • 使用 @Mock 注解

如果使用 @Mock 注解,則必須觸發(fā)創(chuàng)建帶有 @Mock 注解的對象。使用 MockitoRule 可以做到,它通過調(diào)用靜態(tài)方法 MockitoAnnotations.initMocks(this) 來填充帶 @Mock 注解的字段。或者可以使用 @RunWith(MockitoJUnitRunner.class)。

public class UnitTest3 {

? ? // 觸發(fā)創(chuàng)建帶有 @Mock 注解的對象

? ? @Rule public MockitoRule mockitoRule = MockitoJUnit.rule();

? ? // 1. 使用 @Mock 注解創(chuàng)建 mock 對象

? ? @Mock private UnitDao unitDao;

? ? @Test

? ? public void test() {

? ? ? ? // 2. 使用靜態(tài) mock() 方法創(chuàng)建 mock 對象

? ? ? ? Iterator iterator = mock(Iterator.class);

? ? ? ? // when...thenReturn / doReturn...when 模擬依賴調(diào)用

? ? ? ? when(iterator.next()).thenReturn("hello");

? ? ? ? doReturn(1).when(unitDao).delete(anyLong());

? ? ? ? // 斷言

? ? ? ? Assert.assertEquals("hello", iterator.next());

? ? ? ? Assert.assertEquals(new Integer(1), unitDao.delete(1L));

? ? }

}

3.2 使用 mock 對象實踐單元測試

我們要單元測試的內(nèi)容,常常包含著對數(shù)據(jù)庫的訪問等等,那么我們要如何 mock 掉這部分調(diào)用呢?我們可以使用 @InjectMocks 注解創(chuàng)建實例并使用 mock 對象進行依賴注入。

@Service

public class UnitServiceImpl implements UnitService {

? ? @Autowired

? ? private UnitDao unitDao;

? ? @Override

? ? public String sayHello() {

? ? ? ? Integer delete = unitDao.delete(1L);

? ? ? ? System.out.println(delete);

? ? ? ? return "hello unit";

? ? }

}

@RunWith(MockitoJUnitRunner.class)

public class UnitTest2 {

? ? @Mock

? ? private UnitDao unitDao;

? ? @InjectMocks

? ? private UnitServiceImpl unitService;

? ? @Test

? ? public void unitTest() {

? ? ? ? // mock 調(diào)用

? ? ? ? when(unitDao.delete(anyLong())).thenReturn(1);

? ? ? ? Assert.assertEquals("hello unit", unitService.sayHello());

? ? }

}

Mockito 還有很多有趣的實踐,比如:@Spy或spy()方法、verify()驗證等等,鑒于篇幅原因,讀者可自行挖掘。

3.3 使用 PowerMock mock 靜態(tài)方法

Mockito 也有一些局限性。例如:不能 mock 靜態(tài)方法和私有方法。有關(guān)詳細信息,請參閱 Mockito限制的常見問題解答。這個時候我們就要用到 PowerMock,PowerMock 支持 JUnit 和 TestNG,擴展了 EasyMock 和 Mockito 框架,增加了mock static、final 方法的功能。

首先需要引入 PowerMock 的依賴:

? ? ? ? ? ? org.powermock

? ? ? ? ? ? powermock-module-junit4

? ? ? ? ? ? 2.0.7

? ? ? ? ? ? test

? ? ? ? ? ? org.powermock

? ? ? ? ? ? powermock-api-mockito2

? ? ? ? ? ? 2.0.7

接下來就能愉快的 mock 靜態(tài)方法了。

@RunWith(PowerMockRunner.class)

@PrepareForTest({StringUtils.class})

public class UnitTest4 {

? ? @Test

? ? public void test() {

? ? ? ? mockStatic(StringUtils.class);

? ? ? ? when(StringUtils.getFilename(anyString())).thenReturn("localhost");

? ? ? ? Assert.assertEquals("localhost", StringUtils.getFilename(""));

? ? }

}

鏈接:https://www.cnblogs.com/jmcui/p/12802099.html

本文為51Testing經(jīng)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載文章所包含的文字來源于作者。如因內(nèi)容或版權(quán)等問題,請聯(lián)系51Testing進行刪除

推薦閱讀

點擊閱讀?談?wù)剬τ诒U洗a質(zhì)量至關(guān)重要的單元測試!

點擊閱讀?Selenium自動化測試之Unittest單元測試框架的使用!

點擊閱讀?Python 單元測試中處理用例失敗的情況

點擊閱讀?談?wù)剬τ诒U洗a質(zhì)量至關(guān)重要的單元測試!

點擊閱讀?原來 iOS 單元測試可以這么簡單……

總結(jié)

以上是生活随笔為你收集整理的mockito mock void方法_使用 Junit + Mockito 实践单元测试!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。