亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Junit Mockito實現(xiàn)單元測試方法介紹

 更新時間:2022年09月19日 16:52:37   作者:π大星的日常  
JUnit是用于編寫和運行可重復的自動化測試開源測試項目框架,這樣可以保證我們的代碼按與其工作。JUnit可廣泛用于工業(yè)和作為支架(從命令行)或IDE(如IDE)內(nèi)單獨的java程序

一、前言

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

@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 的操作;如果是微服務,可能還要起注冊中心。那么這個“單元”也太大了吧!如果把它稱為集成測試,可能更恰當一點,那么有沒有可能最小粒度進行單元測試嘛?

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

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

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

二、JUnit 框架

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

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

public class UnitTest2 {
    @Test
    public void test() {
        String sayHello = "Hello World";
        Assert.assertEquals("Hello World", sayHello);
    }
}

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

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

三、Mockito 框架

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

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

  • mock 外部依賴關系并將 mock 對象插入待測代碼
  • 執(zhí)行被測代碼
  • 驗證代碼是否正確執(zhí)行

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

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

  • 使用靜態(tài) mock() 方法
  • 使用 @Mock 注解

如果使用 @Mock 注解,則必須觸發(fā)創(chuàng)建帶有 @Mock 注解的對象。使用 MockitoRule 可以做到,它通過調用靜態(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 模擬依賴調用
        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 掉這部分調用呢?我們可以使用 @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 調用
        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)方法和私有方法。這個時候我們就要用到 PowerMock,PowerMock 支持 JUnit 和 TestNG,擴展了 EasyMock 和 Mockito 框架,增加了mock static、final 方法的功能。

首先需要引入 PowerMock 的依賴:

        <!-- PowerMock -->
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.7</version>
        </dependency>

接下來就能愉快的 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(""));
    }
}

到此這篇關于Junit Mockito實現(xiàn)單元測試方法介紹的文章就介紹到這了,更多相關Junit Mockito單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 面試官問如何啟動Java?線程

    面試官問如何啟動Java?線程

    這篇文章主要介紹了面試官問如何啟動Java?線程,Java?的線程創(chuàng)建和啟動非常簡單,但如果問一個線程是怎么啟動起來的往往并不清楚,甚至不知道為什么啟動時是調用start(),而不是調用run()方法呢?下面我們就一起進入文章學習這個問題吧
    2021-12-12
  • SpringBoot 攔截器和自定義注解判斷請求是否合法

    SpringBoot 攔截器和自定義注解判斷請求是否合法

    這篇文章主要介紹了SpringBoot 攔截器和自定義注解判斷請求是否合法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-12-12
  • Java如何處理圖片保存之后變紅色的問題

    Java如何處理圖片保存之后變紅色的問題

    這篇文章主要介紹了Java如何處理圖片保存之后變紅色的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • IDEA一鍵完成格式化、去除無用引用、編譯的操作

    IDEA一鍵完成格式化、去除無用引用、編譯的操作

    這篇文章主要介紹了IDEA一鍵完成格式化、去除無用引用、編譯的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java任務調度的常見實現(xiàn)方法與比較詳解

    Java任務調度的常見實現(xiàn)方法與比較詳解

    這篇文章主要介紹了Java任務調度的常見實現(xiàn)方法與比較,結合實例形式分析了Java任務調度的四種常見實現(xiàn)方法,使用區(qū)別及相關注意事項,需要的朋友可以參考下
    2017-08-08
  • JDK源碼Enum類原理及代碼實例解析

    JDK源碼Enum類原理及代碼實例解析

    這篇文章主要介紹了JDK源碼Enum類原理及代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • SpringDataJpa創(chuàng)建聯(lián)合索引的實現(xiàn)

    SpringDataJpa創(chuàng)建聯(lián)合索引的實現(xiàn)

    這篇文章主要介紹了SpringDataJpa創(chuàng)建聯(lián)合索引的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • MyBatis 引入映射器的方法

    MyBatis 引入映射器的方法

    本文通過實例代碼給大家分享mybatis 引入映射器的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • 基于parameters參數(shù)實現(xiàn)參數(shù)化過程解析

    基于parameters參數(shù)實現(xiàn)參數(shù)化過程解析

    這篇文章主要介紹了基于parameters參數(shù)實現(xiàn)參數(shù)化過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 復雜JSON字符串轉換為Java嵌套對象的實現(xiàn)

    復雜JSON字符串轉換為Java嵌套對象的實現(xiàn)

    這篇文章主要介紹了復雜JSON字符串轉換為Java嵌套對象的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論