單元測試-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了一個測試的對象出來,結果就不是普通方法執行的結果了

運行結果
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結束");

	}
}

這次用設定的條件進行傳值
mock測試結果
從這個結果中可以看出,我們斷言的結果是正確的的,因爲使用了指定的條件,返回了指定的值。

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));

	}

mock結果
從上圖可以看出我們幾種測試條件,指定參數的條件,通配的條件,指定的返回值,原本方法的返回值,這些都是可以靈活使用配置的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章