1. 程式人生 > >PowerMock學習(七)之Mock Constructor的使用

PowerMock學習(七)之Mock Constructor的使用

前言

我們在編碼的時候,總習慣在構造器中傳引數,那麼在powermock中是怎麼模擬帶引數構造的呢,這並不難。

模擬場景

我們先模擬這樣一個場景,通過dao中的傳入一個是布林型別(是否載入)和一個列舉類(使用哪種資料庫),構造Dao這個類,在編寫一個插入學生方法

dao部分的程式碼

具體示例程式碼如下:

package com.rongrong.powermock.mockconstructor;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/28 23:12
 */
public class StudentConstructorDao {
    public enum DataBaseType{
        MYSQL,
        ORACLE,
    }

    /**
     *
     * @param isLoad 資料庫是否載入即連結
     * @param dataBaseType 資料庫型別
     */
    public StudentConstructorDao(Boolean isLoad,DataBaseType dataBaseType) {
        throw new UnsupportedOperationException();
    }

    public void insertStudent(StudentConstructor studentConstructor){
        throw new UnsupportedOperationException();
    }
}

service部分程式碼

用來呼叫dao中的函式,具體程式碼如下:

package com.rongrong.powermock.mockconstructor;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/28 23:18
 */
public class StudentConstructorService {

    public void createStudnet(StudentConstructor studentConstructor){
        StudentConstructorDao studentConstructorDao = new StudentConstructorDao(false, StudentConstructorDao.DataBaseType.MYSQL);
        studentConstructorDao.insertStudent(studentConstructor);
    }
}

編寫測試用例

使用powermock去模擬建構函式,並測試這個service,具體程式碼如下:

package com.rongrong.powermock.mockconstructor;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static com.rongrong.powermock.mockconstructor.StudentConstructorDao.DataBaseType.MYSQL;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/28 23:54
 */
@RunWith(PowerMockRunner.class)
@PrepareForTest(StudentConstructorService.class)
public class TestStudentConstructorService {

    @Test
    public void testStudentConstructorService(){
        StudentConstructorDao studentConstructorDao = PowerMockito.mock(StudentConstructorDao.class);
        try {
            //此處需要註釋下,需要構造一個帶引數的Dao物件,即便是假的也要帶引數,該類初始化的時候就帶引數
            PowerMockito.whenNew(StudentConstructorDao.class).withArguments(false,MYSQL).thenReturn(studentConstructorDao);
            StudentConstructor studentConstructor = new StudentConstructor();
            StudentConstructorService studentConstructorService = new StudentConstructorService();
            studentConstructorService.createStudnet(studentConstructor);
            Mockito.verify(studentConstructorDao).insertStudent(studentConstructor);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

總結

  • 首先mock了一個StudentConstructorDao物件例項
  • 使用whenNew語法,傳入必須入參,注意這裡的引數必須和Service中的引數一致,否則會在Service中還會繼續建立一個新的StudentConstructorDao例項
  • 接著驗證方法的呼叫

注意:當不能確定構造器中引數時,使用withAnyArguments()即可,關於Student類程式碼,參照之前文章Student類,此