1. 程式人生 > >PowerMock學習(一)之PoweMock的入門--模擬新增學生操作

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

關於powermock

在TDD領域Mock框架有很多,比如EasyMock,JMock,Mockito。可能有些同學會好奇了,為什麼要重點把powermock拿出來呢,因為powermock可以解決前面三種框架不能解決的問題,而且powermock也是是單元測試中極其強大的測試框架。

powermock特點

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

powermock入門例項

1、引入依賴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>

2、實際案例

模擬場景:新增學生操作

先建一個名為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了,這回傻了吧,哈哈哈!!!

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

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

具體示例程式碼如下:

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入門結束,如您覺得好,請繼續關注我,謝謝支援!

&n