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
- 16 ##### 適合靜態方法的場景:方法中不使用物件的值,則直接使用靜態方法物件
- 單元測試時靜態方法注意點
- 靜態測試方案
- 關於單例及靜態變數測試單例變數
- JUnit+Mockito單元測試之打樁when().thenReturn();Mockito
- 靜態路由及綜合實驗路由
- 自動化測試 RobotFramework自定義靜態測試類庫總結Framework
- static靜態方法的使用
- 靜態測試解決方案
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- net 靜態方法與非靜態方法
- 靜態應用程式安全測試
- java靜態方法使用泛型Java泛型
- 靜態域與靜態方法
- Spring Cloud Alibaba生態探索:Dubbo、Nacos及Sentinel的完美結合SpringCloud
- 靜態方法
- Helix QAC—軟體靜態測試工具
- Helix QAC — 軟體靜態測試工具
- 靜態合批和動態合批
- Promise 靜態 API 的使用方法PromiseAPI
- CE的使用及靜態地址與動態地址
- JavaScript 靜態屬性與靜態方法JavaScript
- 黑盒測試用例設計方法使用場合
- 靜態應用程式安全測試 (SAST) 工具AST
- Helix QAC-軟體靜態測試工具
- 在AndroidStudio下使用cmake編譯出靜態連結庫的方法Android編譯
- 固態硬碟掉電保護的原理及測試方法硬碟
- Java的方法靜態方法Java
- HelixQAC-軟體程式碼靜態測試工具
- 微服務測試之靜態程式碼掃描微服務
- SAST 與 DAST:靜態和動態應用程式安全測試AST
- 轉發 spring 過濾靜態資源的2種方法Spring
- Spring AOP單元測試綜合指南Spring
- web測試方法總結Web
- Java 靜態代理和動態代理的使用及原理解析Java
- spring-cloud-gateway靜態路由SpringCloudGateway路由
- 理解靜態繫結與動態繫結