單元測試-PowerMockito的使用(1)-mock初體驗
前言
今天講一下Mock的工具,PowerMockito,用來對我們的代碼進行測試。
一、爲什麼測試的時候使用Mock
爲什麼要使用Mock呢,因爲我們在進行單元測試的時候,好多地方需要引用外部對象,但我們又不不可控這些對象,所以爲了解決這個問題,我們要使用Mock來解決,Mock可以模擬這寫外部對象,來滿足我們各種的測試條件。
二、PowerMockito的使用
Mock普通方法
測試目標代碼。最普通的一個方法。
/**
* @version 1.0
* @Description mock示例
* @Author 殘冬十九
* @Date 2020/6/3
*/
public class MockDemo {
/**
* 加法,求兩數之和
* @param a 數值A
* @param b 數值B
* @return 兩數之和
*/
public int addition(int a, int b) {
return a + b;
}
}
1.1 斷言錯誤實現
測試用例代碼(一)
/**
* @version 1.0
* @Description mock測試類
* @Author 殘冬十九
* @Date 2020/6/3
*/
public class MockDemoTest extends TestCase {
public void testAddition() {
//mock一個需要測試的對象
MockDemo mockDemo = mock(MockDemo.class);
//填寫我們的測試條件,如下,當a=1,b=2的時候,調用加法方法返回2,其他時候返回0
when(mockDemo.addition(1, 2)).thenReturn(2);
//下面進行斷言,當mockDemo.addition返回2的時候繼續往下執行,相反則中斷退出
Assert.assertEquals(2, mockDemo.addition(1, 1));
System.out.println("MockDemoTest結束");
}
}
可以根據代碼看到,我們最終的斷言是判斷加法返回的是否是等於2,根據普通代碼所看,最終是返回的2,但是我們mock了一個測試的對象出來,結果就不是普通方法執行的結果了
運行結果
從上圖結果中可以看出,我們期待的結果是2,但實際返回的結果是0,因爲我們使用了mock對象,並且設置了條件,當a=1,b=2的時候纔會返回2,其他則返回0,我們傳入的a=1,b=1明顯不滿足設置的預期條件,所以返回0,此時斷言失敗。
1.2 斷言成功
/**
* @version 1.0
* @Description mock測試類
* @Author 殘冬十九
* @Date 2020/6/3
*/
public class MockDemoTest extends TestCase {
public void testAddition() {
//mock一個需要測試的對象
MockDemo mockDemo = mock(MockDemo.class);
//填寫我們的測試條件,如下,當a=1,b=2的時候,調用加法方法返回2,其他時候返回0
when(mockDemo.addition(1, 2)).thenReturn(2);
//下面進行斷言,當mockDemo.addition返回2的時候繼續往下執行,相反則中斷退出
Assert.assertEquals(2, mockDemo.addition(1, 2));
System.out.println("MockDemoTest結束");
}
}
這次用設定的條件進行傳值
從這個結果中可以看出,我們斷言的結果是正確的的,因爲使用了指定的條件,返回了指定的值。
1.3 擴展方法
public void testAdditionV2() {
//mock一個需要測試的對象
MockDemo mockDemo = mock(MockDemo.class);
//填寫我們的測試條件,如下,當a=1,b=2的時候,調用加法方法返回2,其他時候返回0
when(mockDemo.addition(1, 2)).thenReturn(2);
System.out.println("when(mockDemo.addition(1, 2)).thenReturn(2):
+ mockDemo.addition(1, 2)===" + mockDemo.addition(1, 2));
//如果使用了anyInt()的測試條件,就代表任何數據都可以滿足條件。
when(mockDemo.addition(anyInt(), anyInt())).thenReturn(2);
System.out.println("when(mockDemo.addition(anyInt(), anyInt()))
.thenReturn(2):mockDemo.addition(1, 2)===" + mockDemo.addition(1, 2));
//如果不想同模擬的返回值,而是用真實的返回值的話,就是用thenCallRealMethod放。
when(mockDemo.addition(anyInt(), anyInt())).thenCallRealMethod();
System.out.println("when(mockDemo.addition(anyInt(), anyInt())).
thenCallRealMethod():mockDemo.addition(1, 2)===" + mockDemo.addition(1, 2));
}
從上圖可以看出我們幾種測試條件,指定參數的條件,通配的條件,指定的返回值,原本方法的返回值,這些都是可以靈活使用配置的。