本文是自己學習的一個總結
- 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。