自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

BDDMockito 快速指南,你學(xué)會了嗎?

開發(fā) 前端
Mockito傳統(tǒng)mock是在排列步驟中使用when(obj).then*()執(zhí)行的,稍后,可以在Assert步驟中使用verify()驗(yàn)證與mock的交互。

概述

BDD一詞最早由Dan North于2006年創(chuàng)造。BDD鼓勵用自然的、可讀的語言編寫測試,重點(diǎn)關(guān)注應(yīng)用程序的行為。

它定義了一種結(jié)構(gòu)清晰的測試編寫方式,分為三個部分(排列、動作、斷言):

  • 給定一些先決條件(排列)
  • 行動發(fā)生時(行動)
  • 然后驗(yàn)證輸出(Assert)

Maven依賴項(xiàng):

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.21.0</version>
</dependency>

包含以下靜態(tài)導(dǎo)入,我們的測試可以變得更可讀:

import static org.mockito.BDDMockito.*;

BDDMockito擴(kuò)展了Mockito,所以我們不會錯過傳統(tǒng)Mockito API提供的任何功能。

Mockito與BDDMockito

Mockito傳統(tǒng)mock是在排列步驟中使用when(obj).then*()執(zhí)行的,稍后,可以在Assert步驟中使用verify()驗(yàn)證與mock的交互。

BDDMockito為各種Mockito方法提供了BDD別名,因此我們可以使用given(而不是when)編寫Arrange步驟,同樣,我們可以使用then(而不是verify)編寫Assert步驟。

讓我們看一個使用傳統(tǒng)Mockito的測試體示例:

when(phoneBookRepository.contains(momContactName))
  .thenReturn(false);
 
phoneBookService.register(momContactName, momPhoneNumber);
 
verify(phoneBookRepository)
  .insert(momContactName, momPhoneNumber);

讓我們看看與BDDMockito相比如何:

given(phoneBookRepository.contains(momContactName))
  .willReturn(false);
 
phoneBookService.register(momContactName, momPhoneNumber);
 
then(phoneBookRepository)
  .should()
  .insert(momContactName, momPhoneNumber);

BDDMockito Mock

讓我們試著測試PhoneBookService,我們需要模擬PhoneBookRepository:

public class PhoneBookService {
    private PhoneBookRepository phoneBookRepository;

    public void register(String name, String phone) {
        if(!name.isEmpty() && !phone.isEmpty()
          && !phoneBookRepository.contains(name)) {
            phoneBookRepository.insert(name, phone);
        }
    }

    public String search(String name) {
        if(!name.isEmpty() && phoneBookRepository.contains(name)) {
            return phoneBookRepository.getPhoneNumberByContactName(name);
        }
        return null;
    }
}

BDDMockito作為Mockito允許我們返回一個可能是固定的或動態(tài)的值。它還允許我們拋出一個異常:

  • 返回固定值

使用BDDMockito,我們可以很容易地將Mockito配置為在調(diào)用mock對象目標(biāo)方法時返回固定結(jié)果:

given(phoneBookRepository.contains(momContactName))
  .willReturn(false);
 
phoneBookService.register(xContactName, "");
 
then(phoneBookRepository)
  .should(never())
  .insert(momContactName, momPhoneNumber);
  • 返回動態(tài)值

BDDMockito允許我們提供一種更復(fù)雜的返回值的方法。我們可以根據(jù)輸入返回一個動態(tài)結(jié)果:

given(phoneBookRepository.contains(momContactName))
  .willReturn(true);
given(phoneBookRepository.getPhoneNumberByContactName(momContactName))
  .will((InvocationOnMock invocation) ->
    invocation.getArgument(0).equals(momContactName) 
      ? momPhoneNumber 
      : null);
phoneBookService.search(momContactName);
then(phoneBookRepository)
  .should()
  .getPhoneNumberByContactName(momContactName);
  • 引發(fā)異常

告訴Mockito拋出異常非常簡單:

given(phoneBookRepository.contains(xContactName))
  .willReturn(false);
willThrow(new RuntimeException())
  .given(phoneBookRepository)
  .insert(any(String.class), eq(tooLongPhoneNumber));

try {
    phoneBookService.register(xContactName, tooLongPhoneNumber);
    fail("Should throw exception");
} catch (RuntimeException ex) { }

then(phoneBookRepository)
  .should(never())
  .insert(momContactName, tooLongPhoneNumber);

注意我們是如何交換given和will的位置,這是強(qiáng)制性的,以防我們mock一個沒有返回值的方法。

還要注意,我們使用了(any,eq)等參數(shù)匹配器,以提供一種更通用的基于標(biāo)準(zhǔn)而非固定值的mock方式。

結(jié)論

我們討論了BDDMockito如何試圖將BDD特性引入Mockito測試,并討論了Mockito和BDDMockito之間的一些差異。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2023-01-30 09:01:54

圖表指南圖形化

2022-05-06 09:00:56

CSS元素Flex

2022-10-09 09:30:33

CSS瀏覽器十六進(jìn)制

2022-04-13 09:01:45

SASSCSS處理器

2023-05-04 10:08:00

Windows 10WinAFL二進(jìn)制

2022-04-01 09:02:19

CSS選擇器HTML

2022-10-11 08:48:08

HTTP狀態(tài)碼瀏覽器

2024-01-02 12:05:26

Java并發(fā)編程

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺工具

2024-01-19 08:25:38

死鎖Java通信

2024-01-01 08:15:00

應(yīng)用設(shè)計(jì)模型產(chǎn)品

2025-03-12 00:35:25

多樣化郵件HTML

2024-06-19 09:47:21

2022-06-16 07:50:35

數(shù)據(jù)結(jié)構(gòu)鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2023-10-06 14:49:21

SentinelHystrixtimeout

2024-02-02 11:03:11

React數(shù)據(jù)Ref
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號