PowerMock學習(三)之Mock區域性變數
阿新 • • 發佈:2019-11-21
編寫powermock用例步驟:
- 類上面先寫這兩個註解@RunWith(PowerMockRunner.class)、@PrepareForTest(StudentService.class)
- 先模擬一個假物件即studentdao方法中的區域性變數
- 用無參的方式new物件
- 再模擬這個物件被呼叫時,是否有返回,有返回值給出預設值,沒有用doNothing()
- 驗證有返回值使用assertEquals即可,無返回值使用Mockito.verify驗證
實際案例
接著上一篇文章中的程式碼,修改下service中的程式碼,這次我不通過構造器注入Dao,在方法中new一個StudentDao,建立一個名為StudentNewService的類。
具體示例程式碼如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:13 */ public class StudentNewService { /** * 獲取學生個數 * @return返回學生總數 */ public int getTotal() { StudentDao studentDao = new StudentDao(); return studentDao.getTotal(); } /** * 建立學生 * @param student */ public void createStudent(Student student) { StudentDao studentDao = new StudentDao(); studentDao.createStudent(student); } }
針對上面修改部分程式碼,進行單元測試,以下程式碼有采用傳統方式測試和採用powermock方式進行測試,具體程式碼如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; import org.junit.Assert; 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 org.junit.Assert.assertEquals; import static org.junit.Assert.fail; /** * @author rongrong * @version 1.0 * @date 2019/11/20 21:42 */ @RunWith(PowerMockRunner.class) @PrepareForTest(StudentNewService.class) public class TestNewStudentService { /** * 傳統方式測試 */ @Test public void testGetStudentTotal() { StudentNewService studentNewService = new StudentNewService(); int total = studentNewService.getTotal(); assertEquals(total, 10); } /** * @desc測試有返回值型別 採用powermock進行測試獲取學生個數 */ @Test public void testGetStudentTotalWithPowerMock() { //先模擬一個假物件即studentdao方法中的區域性變數 StudentDao studentDao = PowerMockito.mock(StudentDao.class); try { //這句話我按照英文理解就是,我用無參的方式new了一個StudentDao物件 PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao); //再模擬這個物件被呼叫時,我們預設假定返回10個證明呼叫成功 PowerMockito.when(studentDao.getTotal()).thenReturn(10); //這裡就是service就不用再說了 StudentNewService studentNewService = new StudentNewService(); int total = studentNewService.getTotal(); assertEquals(total, 10); } catch (Exception e) { fail("測試失敗了!!!"); e.printStackTrace(); } } /** * @desc測試的無返回值型別 採用powermock進行測試建立學生 */ @Test public void testCreateStudentWithPowerMock() { //先模擬一個假物件即studentdao方法中的區域性變數 StudentDao studentDao = PowerMockito.mock(StudentDao.class); try { //這句話我按照英文理解就是,我用無參的方式new了一個StudentDao物件 PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao); Student student = new Student(); //這句話註釋與否都能執行通過,也就是我只能判斷他是否被呼叫 //PowerMockito.doNothing().when(studentDao).createStudent(student); //這裡就是service就不用再說了 StudentNewService studentNewService = new StudentNewService(); studentNewService.createStudent(student); Mockito.verify(studentDao).createStudent(student); } catch (Exception e) { fail("測試失敗了!!!"); e.printStackTrace(); } } }
執行上面的測試用例,會發現第一個失敗,後面兩個都執行成功,即有返回值和無返回值型別的測試(void型別)。
注意:對於無返回值型別的測試,只能驗證其是否被呼叫,這裡還請注意。
&n