Spring測試靜態方法打樁-PowerMockito及SpringBootTest結合使用
Mockito無法對靜態方法進行Mock,如果需要Mock靜態方法,需要使用到PowerMockito。
1. Maven依賴
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.1</version>
</dependency>
2. 單元測試
單元測試時,需要使用PowerMockRunner及PrepareForTest兩個註解:
@RunWith(PowerMockRunner.class)
@PrepareForTest({SysCache.class})
public class ModelAssistantServiceUTTest {
private ModelAssistantService modelAssistantService;
private ModelAssistantDao modelAssistantDao;
private String tenantId;
private String deviceTypeId;
@Before
public void before() throws NoSuchFieldException, IllegalAccessException {
modelAssistantService = new ModelAssistantServiceImpl();
modelAssistantDao = MockUtil.mockField(ModelAssistantServiceImpl.class,
modelAssistantService, "modelAssistantDao", ModelAssistantDao.class);
this.tenantId = "158";
this.deviceTypeId = "3000";
// SysCache打樁
PowerMockito.mockStatic(SysCache.class);
PowerMockito.when(SysCache.getTargetDbCache(BDDMockito.anyLong(), BDDMockito.anyString(), BDDMockito.any()))
.thenReturn(new TargetDB());
}
}
如果不使用PrepareForTest,將會報以下錯誤:
... not prepared for test.
而使用PrepareForTest註解時,必須要使用PowerMockRunner才會生效!
3 與SpringBootTest一起使用
SpringBootTest必須要使用SpringRunner才能生效;但RunWith沒有辦法指定多個,可以通過PowerMockRunnerDelegate來解決這個問題:
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PrepareForTest(HttpRequest.class)
@SpringBootTest
單單新增了以上四個註解還是不夠,在執行的時候會報以下錯誤:
java.lang.LinkageError: loader constraint violation: loader (instance of org/powermock/core/classloader/MockClassLoader) previously initiated loading for a different type with name "javax/management/MBeanServer"
此時需要通過PowerMockIgnore註解來解決:
@PowerMockIgnore( {"javax.management.*"})
再次執行,發現又報以下錯誤:
Caused by: java.security.NoSuchAlgorithmException: class configured for SSLContext: sun.security.ssl.SSLContextImpl$TLSContext not a SSLContext
需要在PowerMockIgnore再新增一個忽略項:
@PowerMockIgnore( {"javax.management.*", "javax.net.ssl.*"})
因此,最終測試類上的註解如下:
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PowerMockIgnore( {"javax.management.*", "javax.net.ssl.*"})
@PrepareForTest(HttpRequest.class)
@SpringBootTest
這樣之後測試類終於可以成功啟動了。
相關文章
- 使用 Spring Boot 和 @SpringBootTest 進行測試Spring Boot
- JUnit+Mockito單元測試之打樁when().thenReturn();Mockito
- 靜態應用程式安全測試
- vuecli結合eslint靜態檢查VueEsLint
- Helix QAC — 軟體靜態測試工具
- java靜態方法使用泛型Java泛型
- 靜態變數與靜態方法變數
- Helix QAC-軟體靜態測試工具
- 靜態應用程式安全測試 (SAST) 工具AST
- ASP.NET偽靜態及靜態ASP.NET
- CE的使用及靜態地址與動態地址
- Promise 靜態 API 的使用方法PromiseAPI
- 固態硬碟掉電保護的原理及測試方法硬碟
- JavaScript 靜態屬性與靜態方法JavaScript
- 基於註解的spring 在靜態方法中使用注入的類Spring
- 微服務測試之靜態程式碼掃描微服務
- HelixQAC-軟體程式碼靜態測試工具
- Spring Cloud Alibaba生態探索:Dubbo、Nacos及Sentinel的完美結合SpringCloud
- SAST 與 DAST:靜態和動態應用程式安全測試AST
- web測試方法總結Web
- Java的方法靜態方法Java
- Delphi系列談之:Delphi中的靜態屬性及靜態方法的實現 (轉)
- 如何使用spring測試模組測試請求功能Spring
- java中static使用之靜態方法注意點Java
- Objective-C使用靜態方法建立字串物件Object字串物件
- Jmeter——結合Allure展示測試報告JMeter測試報告
- Oracle listener靜態及動態註冊總結(轉自網路)Oracle
- Helix QAC—原始碼級靜態自動化測試工具原始碼
- iOS打測試包與分發測試iOS
- 偽物件、樁物件、模擬物件|單元測試物件
- Java 靜態代理和動態代理的使用及原理解析Java
- 前端單元測試總結及測試工具介紹前端
- 理解靜態繫結與動態繫結
- Hexo結合Stun靜態部落格搭建從入門到入土Hexo
- 在AndroidStudio下使用cmake編譯出靜態連結庫的方法Android編譯
- 轉發 spring 過濾靜態資源的2種方法Spring
- 遊戲圖形批量渲染及優化:Unity靜態合批技術遊戲優化Unity
- Spring Boot單元測試之服務層測試總結Spring Boot