使用Junit和mockito寫單測的一些注意點

2021-08-16 15:59:05 字數 1839 閱讀 6140

使用mockito和junit進行單測的一些要點:

1,總的來說寫乙個單測需要提前進行三件事

a,看好你要測的函式的入參,構建出乙個入參;

b,詳細看好你的函式中依賴了哪些寫好的函式,這些函式需要進行

@mock宣告,將他們mock掉,使得你的單測只測試你寫的邏輯**;

c,判斷你要得到什麼樣的結果,也就是你的函式要改變哪些變數的值,然後在ut的最後用assert斷言來對這些期望值進行**判斷

下面寫乙個例子,本例要驗證fillmodel這個函式,它的作用是將乙個list中每乙個model的defined屬性設定為true,需要呼叫外部的依賴itemservice來獲取乙個model2的defined值,然後將這個值填入model的defined屬性中。

本例中輸入引數是乙個list,乙個model裡填入kdtid和id兩個屬性,所以首先進行引數準備(見**);

本例需要依賴itemservice下的getspumap方法,希望這個方法返回乙個map,而這個map中value元素model2的defined屬性經過這個方法被設定為true,注意這個方法不是我們寫的,所以在這裡需要被mock掉,而mock掉後返回的結果是希望含有defined屬性為true的。

所以,首先我們構造乙個這個itemservice方法的返回值,也就是乙個map,這個map的value是乙個model2類,而model2的defined被我們預先設定為true;

然後用when語句mock掉itemservice方法,使其返回我們構造好的這個map:

when(itemservice.getspumap(anylong(), anylist())).thenreturn(map);
最後呼叫我們要測驗的方法,然後檢視呼叫後model的defined是否和我們預設的model2的值一樣。

需要注意的是,因為我們要測試的fillmodel這個方法是需要被實際執行的,不能被mock,所以這個方法的類(通常也就是你的測試類對應的方法類)需要加上@injectmock註解。而其中依賴的itemservice.getspumap方法不是我們寫的,我們只是依賴於它的返回值,這個類的初始化要加上@mock註解。

@test

public void test_fillmodel()

另外還有很多實用mockito進行測試的小問題,舉幾個例子:

1,巧用verify語句

verify是用來驗證某函式的執行與否,執行幾次,沒有被執行等

@test

public void verifying_number_of_invocations()

3,用spy來真正呼叫真實的api

@test  

public void real_partial_mock()

class a

}

4,使用 new answer()來對未預設的呼叫更改預設期望值

@test  

public void unstubbed_invocations()

});

//下面的get(1)沒有預設,通常情況下會返回null,但是使用了answer改變了預設期望值

assertequals(999, mock.get(1));

//下面的size()沒有預設,通常情況下會返回0,但是使用了answer改變了預設期望值

assertequals(999,mock.size());

}

mock的使用相對簡單,但是有很多小細節需要注意,以後使用過程中遇到的問題會更在後面。

MockMvc和Mockito之酷炫使用

由於專案中需要新增單元測試,所以查詢之後發現mockito非常適合現在的web專案。首先需要新增pom依賴 junit junit 4.11 test org.mockito mockito all 1.9.5 在controllertest類上需要新增如下配置 xml風格 runwith spri...

Junit3和Junit4使用區別

在專案經常會用到單元測試,這裡對junit在開發中的使用標準及使用方法進行簡單的介紹。所測試的源 package com.techbirds public class helloworld public void sayworld public string say junit3測試類編寫 pack...

使用junit和Mock做介面測試

一般建立springboot專案的時候,一般都會有test包的依賴,該依賴包依賴了junit,mockito的依賴 org.springframework.boot spring boot starter test test 編寫乙個總的父類 package com.voole import org...