共計 3067 個字符,預計需要花費 8 分鐘才能閱讀完成。
本篇內容主要講解“Powermock 靜態方法怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Powermock 靜態方法怎么使用”吧!
Mockito 很強大, 但是它不支持靜態方法. 所以, 就用 Powermock 了. 要測試的對象是 Controller 中的接口, 對單元測試來說, 這個待測試的街口應該是一個白盒的. 所以, 其中的第三方 (service, 其他靜態類) 的調用都應該使用 mock 對象來 stub 起來. 下面是 ## 示例代碼(隨手寫的, 說明問題就行):
Controller:
@Controllerpublic 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 靜態類:
```javapublic 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();
到此,相信大家對“Powermock 靜態方法怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!