PowerMock學習(一)之PoweMock的入門--模擬新增學生操做

關於powermock

在TDD領域Mock框架有不少,好比EasyMock,JMock,Mockito。可能有些同窗會好奇了,爲何要重點把powermock拿出來呢,由於powermock能夠解決前面三種框架不能解決的問題,並且powermock也是是單元測試中極其強大的測試框架。數據庫

powermock特色

  • 主要圍繞着Junit、TestNg測試框架開展進行
  • 對所依賴的Jar包很是的苛刻,出現jar包的衝突或者不一致就不能使用
  • PowerMock也是一種Mock,主要是解決其餘Mock不能解決的問題,通俗的講,就是專治各類不服

powermock入門實例

一、引入依賴jar包

 <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-testng</artifactId>
            <version>1.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>1.5.6</version>
            <scope>compile</scope>
        </dependency>

二、實際案例

模擬場景:新增學生操做api

先建一個名爲StudentService的類,用來模擬服務調用操做,在這個類型中新增一個方法,來新增學生操做。服務器

具體示例代碼以下:框架

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:13
 */
public class StudentService {
    private StudentDao studentDao;

    public StudentService(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    /**
     * 新增學生操做
     *
     * @param studentDao
     */
    public int addStudent(StudentDao studentDao) {
        return studentDao.addStudent();
    }
}


能夠看出建立service須要傳遞StudentDao這個類,接着咱們再來建立StudentDao這個類,用於進行新增操做。單元測試

具體示例代碼以下:測試

package com.rongrong.powermock.dao;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:15
 */
public class StudentDao {
    public int addStudent() {
        throw new UnsupportedOperationException();
    }
}

 

仔細看,你會發現,你確定調不了dao了,這回傻了吧,哈哈哈!!!this

你會好奇這塊爲啥我拋出UnsupportedOperationException異常呢,由於我就想模擬服務不可用的狀況(實際中常常會遇到可能因爲某種緣由(沒有完成,或者資源不存在等)沒法爲 Service 服務),這樣的狀況,難道咱們就不測試了嗎?spa

那我仍是乖乖的把測試用例寫完,並測試下吧,下面咱們再來建立一個名爲StudentServiceTest的測試類。code

具體示例代碼以下:對象

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;
import org.testng.annotations.Test;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:19
 */
public class StudentServiceTest {
    @Test
    public void testAddStudent() {
        StudentDao studentDao = new StudentDao();
        StudentService studentService = new StudentService(studentDao);
        studentService.addStudent(studentDao);
    }

}

 

上面的測試用例確定會執行失敗,那咱們也來執行下看,效果以下圖:

 

 

咱們先將這個報錯,腦補爲連接不上數據庫,問題很明顯,數據庫掛了,就是鏈接不上了,等着服務器好了得三天後,但是今晚領導就要看功能實現,你該怎麼辦?沒法測試service,難道就真的結束了嗎?
答案是否認的,此時咱們用powermock即可完美解決問題,接下來咱們請出powermock登場。

具體代碼以下:

 

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;
import org.powermock.api.mockito.PowerMockito;
import org.testng.Assert;
import org.testng.annotations.Test;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:19
 */
public class StudentServiceTest {

    @Test
    public void testAddStudentWithMock() {
        StudentDao studentDao = PowerMockito.mock(StudentDao.class);
        PowerMockito.when(studentDao.addStudent()).thenReturn(666);
        StudentService studentService = new StudentService(studentDao);
        int total = studentService.addStudent(studentDao);
        Assert.assertEquals(total, 666);
    }


}

 

這時再次運行,你會發現神奇般的運行經過,結果以下圖所示:

 

 

是否是很神奇,很驚喜,沒錯,這個框架就是這麼強大。

咱們能夠這樣理解mock就是建立一個假的該對象,而後須要你告訴這個對象調用某個方法的時候返回某個你指定的值便可。

到此,一個簡單powermock入門結束,如您以爲好,請繼續關注我,謝謝支持!

相關文章
相關標籤/搜索