網頁

2018/3/6

JUnit 4 搭配Mockito 2簡單範例

本篇介紹如何建立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廣告,感恩。


參考:

沒有留言:

張貼留言