1. 程式人生 > >PowerMock處理特殊的單元測試

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