Mockito單元測試學習筆記(1):Mockito簡介

本文是自己學習的一個總結

1、什麼是單元測試

我自己的理解是,單元測試就是面向函數的一個測試。這種測試只是針對函數內的邏輯進行測試。如果這個函數依賴了外界,那麼單元測試是應該要屏蔽掉外界的影響的。

比如web開發中,service層中有一個方法用來用來插入數據。

public class Service implements ServiceImpl {
	/**
	 * 這就是service中一個普通的方法,但它在執行過程中會依賴外部資源。
	 */
	@Override
	public void  insertData(Data data) {
		//dao是已經注入的實例化對象,dao.insertData()方法插入成功返回true,插入失敗返回false。
		if(dao.insertData(data)) {
			//如果插入成功,執行一些操作
		}	else {
			//如果插入失敗,執行其他操作
		}
	}	
}

對於上面的這個方法,我們要對它單元測試的話,測試的範圍應該只限於insertData()這個方法的邏輯,即驗證插入成功後的邏輯和插入失敗後的邏輯。

我們不應該讓測試邏輯去真正執行依賴的dao層方法。主要有以下兩點原因

  • 依賴的對象方法在單元測試中不重要,它涉及到了數據庫的操作,比如連接數據庫,使用的是MySQL或者Oracle等。但這些我們都不關心,不在我們想要測試的範圍。
  • 依賴的對象方法真正執行的時候可能會出錯(比如數據庫密碼錯誤,數據庫連接不上等),這種錯誤會讓我們的單元測試進行不下去。
    在單元測試中不重要,它涉及到了數據庫的操作,不在我們想要測試的範圍。我們應該想辦法模擬出數據庫的行爲(測試的時候不作出真正的數據庫操作)。

2、Mockito單元測試

2.1、Mockito單元測試框架簡介

Mockito是個用來單元測試的框架。它給我們提供了很多方便的工具來單元測試。

上面提到單元測試中,如果方法邏輯依賴到了外部對象,那在測試時我們應該模擬外部對象的行爲,讓測試的邏輯不去真正執行外部對象的方法。

但真正模擬的時候困難重重。但如果我們使用Mockito框架的話,可以通過簡單的註解和一些方法輕鬆達到模擬的效果。我們可以先看看Mockito的一個使用示例。

/**
 * 這是測試類
 */
public class StudentServiceTest {
	/**
	 * 先不要管這個方法在幹什麼
	 */
    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }
    /**
     * 這裏可以先理解成生成了一個實例對象。StudentServiceTest測試類就是想對這個類中的方法進行單元測試
     */
    @InjectMocks
    private StudentService studentService;
    
    /**
     * 這個是studentService會依賴的外部對象,@Mock註解相當於模擬出這個類的一個實例,
     * 然後注入到@InjectMocks標記的成員中(即studentService)。
     * 現在可以簡單地看成Spring中的@Autowired註解。
     */
    @Mock
    private StudentDao studentDao;
	
	/**
	 * @Test標註的方法就是測試方法,從方法名上看,這是對StudentService的insertData方法做單元測試
	 */
	@Test
	public void insertDataTest() {
		Data data = new Data();
		//省略對data賦值的操作
		//設置,如果執行到StudentDao中的insertData方法,就返回true。簡單一句話達到模擬效果
		Mockito.when(studentDao.insertData(Mockito.any()).thenReturn(true);
		//執行studentService的insertData方法時,遇到StudentDao中的insertData方法,就會返回true,
		//這樣我們就可以測試插入成功的邏輯了
		studentService.insertData(data);
	}
}

從上面的例子可以看出,Mockito框架提供的一些方法和註解,能讓我們很方便地進行單元測試。

2.2 Maven引入Mockito

2.2.1 配置maven依賴

以下的maven依賴可以直接搜索Maven Mockito得到,注意版本號不要太高,不然項目的Java版本需要8以上的版本才支持。

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.23.4</version>
    <scope>test</scope>
</dependency>

因爲Mockito是在傳統的測試上運行的,所以也要加上Junit的maven。

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>

2.2.2 配置單元測試的範圍(可有可無)

我們可以通過白名單(黑名單),配置正則表達式,規定哪些類需要測試,哪些類不需要測試。
在plugn中引入org.apache.maven.plugins。然後在其configuration標籤中設置excludes(黑名單)或includes(白名單)。
下面的表示項目啓動時,不要對二級目錄名稱爲manual的類測試。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>**/manual/**/*.java</exclude>
        </excludes>
    </configuration>
</plugin>

配置完這些以後,可以開始寫Mockito單元測試了。我記錄了一個簡單的入門,可以看看這篇文章https://blog.csdn.net/sinat_38393872/article/details/106539895。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章