本篇介紹如何建立JUnit搭配Mockito的測試範例。
基本環境如下
- jdk 1.8
- Eclipse OXYGEN
首先開啟Eclipse,因為本範例使用Maven來加入所需的函式庫,所以要新增一個Maven專案。
專案建立好後,開啟pom.xml
來加入jar檔,設定如下。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>idv.matt</groupId>
<artifactId>mockitodemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mockitodemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 加入Mockito的jar-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.15.0</version>
</dependency>
</dependencies>
</project>
本範例使用的Junit為4.12版本,Mockito為2.15.0版本。
以上便是基本的環境設定。
接著新增以下檔案,分別為:
- 被測試的類別(
UserService.java
) - 被測試類別所相依的類別(
UserDao.java
) - 用來測試的類別(
UserServiceTest.java
)
新增完後目錄結構如下。
UserService
package idv.matt.mockitodemo;
public class UserService {
UserDao userDao;
public boolean isExisted(int userId) {
userDao.isExisted(userId);
return true;
}
}
UserDao
package idv.matt.mockitodemo;
public class UserDao {
public boolean isExisted(int userId){
// some query
return true;
}
}
UserServiceTest
package idv.matt.mockitodemo;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
UserDao userDaoMock;
@InjectMocks
UserService userService = new UserService();
// 作用同@RunWith(MockitoJUnitRunner.class)
// @Before
// public void init() {
// MockitoAnnotations.initMocks(this);
// }
@Test
public void testIsExisted() {
final int userId = 1;
boolean check = userService.isExisted(userId);
assertTrue(check);
verify(userDaoMock).isExisted(userId);
}
}
因為要利用Mockito來使用mock物件來測試,則測試類別上要加@RunWith(MockitoJUnitRunner.class)
來啟用@Mock
,@InjectMocks
,或透過上面註解起來的程式來初始化Mock物件。
@Mock
標記的成員即為mock物件,也就是假的物件。
@InjectMocks
標記的成員會被注入mock物件,也就是被標記@Mock
的成員,所以範例中userService
物件中的userDao
便會被注入userDaoMock
物件。
在測試方法testIsExisted()
中測試了UserService.isExisted()
,而verify(T mock)
是用來驗證userService
中是否有確實呼叫UserDao.isExisted()
,如果有則pass,反之fail。在範例中userService
確實有呼叫UserDao.isExisted()
所以pass。
如果將UserService
中的userDao.isExisted(userId)
註解起來則會fail。
如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。
參考:
沒有留言:
張貼留言