PowerMock學習(七)之Mock Constructor的使用
阿新 • • 發佈:2019-11-29
前言
我們在編碼的時候,總習慣在構造器中傳引數,那麼在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類,此