天天看點

Mockito單元測試學習筆記(1):Mockito簡介1、什麼是單元測試2、Mockito單元測試

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

  • 1、什麼是單元測試
  • 2、Mockito單元測試
    • 2.1、Mockito單元測試架構簡介
    • 2.2 Maven引入Mockito
      • 2.2.1 配置maven依賴
      • 2.2.2 配置單元測試的範圍(可有可無)

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。