PowerMock處理特殊的單元測試
背景
程式碼設計並不總是盡善盡美,有些單元測試是Mockito力不從心的。
這時候就需要PowerMock ,這個框架是對Mockito增強。
下面展示幾個常用場景
- mock靜態方法
- 跳過私有方法
- 更改子類無法訪問的父類私有field
- 更改類的私有static常量
- 模擬New建構函式
示例
首先引入Maven依賴
<dependency>
<groupId>org.powermock</groupId>
<artifactId> powermock-api-mockito</artifactId>
<version>1.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId >
<version>1.7.0</version>
<scope>test</scope>
</dependency>
要測試的業務類包含了幾個特殊用例
abstract class MyParent {
private String parentValue = "parent";
private String getMessageContent() {
return parentValue;
}
protected String getParentMessage() {
return getMessageContent();
}
}
public class Mytest extends MyParent {
private static String BID = "999";
public Mytest() {
}
public static String getBid() {
return BID;
}
public static String getMessage() {
return "hello";
}
public String sendEmail() {
String response = "send email";
System.out.println(response);
response = sendMessage("success");
return response;
}
private String sendMessage(String status) {
System.out.println("send message " + status);
return "send message " + status;
}
}
編寫單元測試
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.api.support.membermodification.MemberModifier;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
@RunWith(PowerMockRunner.class) //以PowerMock啟動Junit test
@PrepareForTest({Mytest.class}) //預處理要mock的類,在位元組碼的級別更改類的行為
public class Testmethod {
@Test
public void testStaticMethod() {//mock靜態方法
PowerMockito.mockStatic(Mytest.class);
Mockito.when(Mytest.getMessage()).thenReturn("world");
Assert.assertEquals("world", Mytest.getMessage());
}
@Test
public void skipPrivateMethod() {//跳過私有方法
Mytest t = new Mytest();
PowerMockito.suppress(PowerMockito.method(Mytest.class, "sendMessage", String.class)); //類,方法名,引數類
String response = t.sendEmail();
Assert.assertTrue(response == null);//跳過了sendMessage方法,返回為null
}
@Test
public void changeParentPrivate() {//更改子類無法訪問的父類私有field
Mytest t = new Mytest();
try {
MemberModifier.field(Mytest.class, "parentValue").set(
t, "tomcat");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Assert.assertEquals("tomcat", t.getParentMessage());//父類私有field已經被更改
}
@Test
public void changeBid() {//更改類的私有static常量
Whitebox.setInternalState(Mytest.class, "BID", "888");
Assert.assertEquals("888", Mytest.getBid());
}
@Test
public void mockNew() throws Exception {//模擬New構造方法
Mytest test = Mockito.mock(Mytest.class);
Mockito.when(test.getParentMessage()).thenReturn("hello");
PowerMockito.whenNew(Mytest.class).withNoArguments().thenReturn(test);
Mytest testNew = new Mytest();
Assert.assertEquals("hello", testNew.getParentMessage());
}
}
已知問題
PowerMock實現了自己的類載入器,佔用記憶體大,容易造成記憶體不足:OutOfMemoryError
相關推薦
PowerMock處理特殊的單元測試
背景 程式碼設計並不總是盡善盡美,有些單元測試是Mockito力不從心的。 這時候就需要PowerMock ,這個框架是對Mockito增強。 下面展示幾個常用場景 - mock靜態方法 - 跳過私有方法 - 更改子類無法訪問的父類私有fie
【SpringBoot】Http請求統一異常(返回資料)處理與單元測試
對返回資料格式的統一 首先規定一下錯誤的輸出格式: { "code": 1, "msg": "提示", "data": null } data是一個物件 首先定義一個http請求返回的類 package cn.
PowerMock單元測試
cep nbsp eth getconf 返回 light mod 介紹 moc 在Java程序的單元測試中常用的mock工具有Mockito和EasyMock。但是這兩種mock工具都無法實現對靜態、final、私有方法或類的mock。因此有了功能強大的P
在單元測試中處理Debug.Assert的好方法
在單元測試專案的配置檔案中配置好, <?xml version="1.0" encoding="utf-8"?> <configuration> <system.diagnostics> <assert assertuienabled="false"/
單元測試框架PowerMock
1.概述 Mockito 是一個針對 Java 的單元測試模擬框架,它與 EasyMock 和 jMock 很相似,都是為了簡化單元測試過程中測試上下文的搭建而開發的工具。 PowerMock 也是一個單元測試模擬框架,它是在其它單元測試模擬框架的基礎上做出的擴充套件。通過提供定製的
關於老舊程式碼補充單元測試的接縫處理(如何通過依賴注入解決程式碼的依賴問題)
上次我們說到了可以利用單元測試輔助我們進行程式碼的重構。眾所周知,單元測試的最佳切入點,是在寫程式碼之前。有很多老舊程式碼可能是不太適合單元測試的直接插入的。所以上次的討論遺留了一個問題:有些方法很長,做了很多事情,甚至沒有返回值,我怎麼把這些方法分解開,然後套上單元測試?我們把這個問題換一個說法:如何將
使用Powermock和mockito來進行單元測試
簡介 Mockito是一個流行的Mocking框架。它使用起來簡單,學習成本很低,而且具 有非常簡潔的API,測試程式碼的可讀性很高。因此它十分受歡迎,使用者群越來越 多,很多的開源的軟體也選擇了Mockito。 要想了解更多有關Mockito的資訊,請訪問它的官方網站:h
python錯誤處理/調試/單元測試/文檔測試
highlight execption 語句 unittest filename raise 不能 key nbsp 一.錯誤處理 1.錯誤處理 try: ... except Exception1: ... except Exception2:
Spring整理系列(16)——通過單元測試理解spring容器以及dubbo+zookeeper單元測試異常處理
一、先說一個結論:單元測試與主專案的spring容器是隔離的,也就是說,單元測試無法訪問主專案spring容器,需要自己載入spring容器。 接下來是程式碼例項,WEB主專案出於執行狀態,單元測試中可能會看到如下這樣的程式碼: 程式碼一:當前類載入式
使用PowerMock和Easymock進行單元測試
Java單元測試對於開發人員質量保證至關重要,尤其當面對一團亂碼的遺留程式碼時,沒有高覆蓋率的單元測試做保障,沒人敢輕易對程式碼進行重構。然而單元測試的編寫也不是一件容易的事情,除非使用TDD方式,否
dubbo應用程式的單元測試環境搭建(springtest,powermock,mockito)(一)
最近,專案中頻繁用到dubbo,而且java工程用引用了幾十個關聯絡統的服務(如使用者認證,基礎服務,客戶平臺)。這些服務都是dubbo服務,對我們僅提供了一個介面,服務通過zookeeper註冊,並給我們提供服務。我們的專案都是基於spring的。spring整合dubb
對於用Powermock編寫的測試用例,sonar中單元測試覆蓋率統計不正確的問題
用PowerMock寫的單元測試用例,sonar中覆蓋率顯示問題 sonar中沒有覆蓋率的顯示問題 sonar中覆蓋率顯示不正確 sonar中單元測試用例個數不正確問題 sonar中沒有覆蓋率的顯示問題 pom檔案中jacoco-maven-
【騰訊TMQ】【測試左移專欄】用Powermock和Mockito來做安卓單元測試
作者:ZeusL 團隊:騰訊移動品質中心TMQ 一、單元測試及Android單元測試簡介 慣例,先簡單介紹下理論知識,懂得的可以跳過。 1、單元測試定義和特性 單測定義: 在計算機程式設計中,單元測試(Unit Testing)又稱為模組測試,
使用 Spring + Mockito+PowerMock +spring-test-dbunit+hsqldb 進行單元測試可實現100%覆蓋率
使用 Mockito 比easyMock 更簡單 使用 PowerMock 可模擬靜態、私有方法 使用spring-test-dbunit 可以實現註解方式匯入xml 到資料庫,為資料庫提供測試資料如: @DatabaseSetup @DatabaseTearDown
Django 中的 csrf_token 與單元測試報錯處理
在Harry J.W. Percival 所著的<Python Web開發:測試驅動方法>中的第五章,在單元測試部分存在一個bug。 即,在高版本的Django(>1.7)中,在渲染模板時,Django 會把這個模板標籤替換成一個<input ty
junit單元測試時通過spring注入的類為空怎麼處理
加入@runwith及@contextConfiguration 以便在測試開始的時候自動建立Spring的應用上下文 @ContextConfiguration(classes=CDPlayerConfig.class) publicclass CDPlayer
單元測試之PowerMock
PowerMock PowerMock支援JUnit和TestNG,擴充套件了EasyMock和Mockito框架,增加了mock static、final方法的功能。本文介紹基於JUnit框架的PowerMock。
android junit 單元測試與輸出日誌資訊檢視處理
專業Android Java 技術解答群 嚴禁無關技術內容聊天 一經發現 立即清退 單元測試 1.搭建專案測試環境 在主檔案 AndroidMainfest.xml中的application標籤
Spring Boot 2 實踐記錄之 使用 Powermock、Mockito 對 UUID 進行 mock 單元測試
alt 生成 digest md5 加密 調用 uuid tid 第一步 加密算 由於註冊時,需要對輸入的密碼進行加密,使用到了 UUID、sha1、md 等算法。在單元測試時,使用到了 Powermock,記錄如下。 先看下加密算法: import org.apache
.NET Core之單元測試(二):使用記憶體資料庫處理單元測試中的資料庫依賴
目錄 定義一個待測試API 測試用例 為減少篇幅,隱藏了SampleEntity和SqliteDbContext 定義一個待測試API 如下,我們定義了一個名為Sample的API,其中有一個外部依賴項Sqli