原 薦 單元測試時靜態方法注意點
單元測試時靜態方法注意點
原
薦
字數 848
閱讀 8
收藏 0
Mockito Java" rel="nofollow,noindex" target="_blank">Java PowerMock
Mockito 很強大, 但是它不支援靜態方法.所以, 就用Powermock了. 要測試的物件是Controller中的介面, 對單元測試來說, 這個待測試的街口應該是一個白盒的. 所以, 其中的第三方(service,其他靜態類)的呼叫都應該使用mock物件來stub起來. 下面是## 示例程式碼(隨手寫的,說明問題就行):
Controller:
@Controller public class MainController { @Autowired private MainService mainService; @GetMapping("/hello") public String hello(){ mainService.hello(); String result = HelloUtil.hi(); if(result.equals("hi")){ return "ok"; }else { return "fail"; } } }
Service:
/** * Created by icer on 2017/10/13. */ @Service public class MainService { public String hello(){ System.out.println("hello"); return "hello"; } } Util靜態類: ```java public class HelloUtil { public static String hi(){ return "hi"; } }
我們要測試的是MainController中的hello方法.
再次注意, 是hello方法,不是hello介面. 我們的測試類:
@RunWith(PowerMockRunner.class) @PrepareForTest(HelloUtil.class) public class MainControllerTest { [@Mock](https://my.oschina.net/mock) private MainService mainService; @InjectMocks private MainController mainController; [@Test](https://my.oschina.net/azibug) public void helloTest(){ PowerMockito.when(mainService.hello()).thenReturn("hello"); PowerMockito.mockStatic(HelloUtil.class); PowerMockito.when(HelloUtil.hi()).thenReturn("hi"); HelloUtil.hi(); HelloUtil.hi(); String result = mainController.hello(); PowerMockito.verifyStatic(Mockito.times(3)); HelloUtil.hi(); HelloUtil.hi(); HelloUtil.hi(); // mainController.hello(); assertEquals(result, "ok"); } }
我們著重看的是上面的HelloUtil.hi()方法.
PowerMockito.verifyStatic(Mockito.times(3));
先說下這句的意思, 這句(後面簡稱靜態校驗)就是對靜態方法的呼叫次數做了校驗. 光看命名就能想通. 但是要注意的是, 這裡的3指的是在靜態校驗之前的呼叫次數. 如果靜態校驗執行的次數不等於這個次數, 那麼靜態校驗後面的靜態方法就不能再執行了. 上面程式碼中, 在這句前一共執行了三次HelloUtil.hi(); 兩次是主動明文執行的, 一次是在mainController.hello()裡面執行的. 如果註釋掉某一個, 那麼就會看到日誌列印:
org.mockito.exceptions.verification.TooLittleActualInvocations: cn.com.hanbinit.utils.HelloUtil.hi(); Wanted 3 times but was 2 times.
這裡只校驗靜態校驗之前的執行次數, 後面執行多少次都沒關係. 另外, 還有一點要注意的是, 在校驗語句前, 我們前面給方法mock的返回值是有效的, 在校驗之後就沒效果了.
所以, 我們對靜態方法的測試, 應該是放在verifyStatis之前進行的. 在校驗之後的執行, 是為了證明我們之前的校驗是ok的.
校驗之後的靜態方法呼叫, 是一定要有的. 要不然是測試不出呼叫次數的. 參見下面程式碼:
@Test public void helloTest(){ PowerMockito.when(mainService.hello()).thenReturn("hello"); PowerMockito.mockStatic(HelloUtil.class); PowerMockito.when(HelloUtil.hi()).thenReturn("hi"); String result = HelloUtil.hi(); String hi = HelloUtil.hi(); PowerMockito.verifyStatic(Mockito.times(4)); assertEquals(result, "hi"); }
像上面這段程式碼, 測試是通過的. 改成下面這樣:
@Test public void helloTest(){ PowerMockito.when(mainService.hello()).thenReturn("hello"); PowerMockito.mockStatic(HelloUtil.class); PowerMockito.when(HelloUtil.hi()).thenReturn("hi"); String result = HelloUtil.hi(); String hi = HelloUtil.hi(); PowerMockito.verifyStatic(Mockito.times(4)); HelloUtil.hi(); assertEquals(result, "hi"); }
就能看到日誌:
org.mockito.exceptions.verification.TooLittleActualInvocations: cn.com.hanbinit.utils.HelloUtil.hi(); Wanted 4 times but was 2 times.
所以, 對靜態方法呼叫次數的校驗一定是verifyStatis和之後的顯示呼叫一起來進行的. 最後的最後, 再提一句: 如果同時有多個靜態方法呼叫. 如果都要驗證呼叫次數, 那麼應該分別像下面這樣使用多次:
PowerMockito.verifyStatic(Mockito.times(4)); HelloUtil.hi();
[1]: https://blog.hanbinit.com.cn/usr/uploads/2017/10/12449159.png

© 著作權歸作者所有
共有人打賞支援
下一篇: 淺談敏捷
相關文章 最新文章
Kotlin 寫 Android 單元測試系列: Kotlin 寫 Android 單元測試(一),單元測試是什麼以及為什麼需要 Kotlin 寫 Android 單元測試(二),JUnit 4 測試框架和 kotlin.test 庫的使用 Kotlin...
JohnnyShieh
2017/12/14
0
0
為神馬要使用Mockito? 在編寫單元測試的時候,為了儘可能的保證隔離性,我們時常需要對某些不容易構造或者不容易獲取或者對外部環境有依賴的物件,用一個虛擬的物件來建立以便於測試.假設你...
冬至飲雪
2017/06/06
0
0
軟體測試的目的 什麼是軟體測試? 軟體測試是 執行的軟體以驗證程式碼狀態(state testing)或事件序列(behavior testing)符合預期 。 軟體測試的作用 軟體單元測試幫助開發人員驗證程式的部分邏...
磁針石
2016/01/12
487
0
Java 單元測試: 單元測試是開發者編寫的一小段程式碼,用於檢測被測程式碼的一個很小的、很明確的功能是否正確。 單元測試的方法: 人工靜態分析:人工閱讀檢測程式碼 自動靜態分析:使用程式碼複查...
醉風林天
2017/05/09
0
0
沒有更多內容
載入失敗,請重新整理頁面
載入更多Osc亂彈歌單(2018)請戳(這裡) 【今日歌曲】 @胖達panda :分享陶晶瑩/張雨生的單曲《我期待》 《我期待》- 陶晶瑩/張雨生 手機黨少年們想聽歌,請使勁兒戳(這裡) @cc_z :熬夜一時爽,...
小小編輯
39分鐘前
324
9

response生成驗證碼 驗證碼的作用:防止惡意註冊、攻擊等 網站上看到的驗證碼,實際上都是一些圖片,而這些圖片都是程式(Servlet)生成的! package day19.test; import java.awt.Color; i...
碼農屌絲
今天
1
0
《毒液》剛剛上映,創造漫威宇宙的人卻走了 雪梨 2018-11-14 1.今日導讀 中國的金庸創造了俠義英雄和江湖傳奇,而大洋彼岸的斯坦·李也同樣創造了一個絢爛璀璨的漫威宇宙,他構思的每個超級英...
飛魚說程式設計
今天
16
0
沒有更多內容
載入失敗,請重新整理頁面
載入更多