簡體   English   中英

在Java中存根私有方法

[英]stubbing private method in Java

我正在測試一個需要幾個參數的函數,並根據它們的值調用不同的私有方法。

我想檢查該函數始終調用正確的私有方法。

因為我知道私有方法會做什么,所以我可以檢查最終結果,但是能夠直接檢查是否調用了正確的函數會更方便,因為我已經測試了私有方法。

有沒有辦法用存根替換privae方法?

是的,有一些模擬庫可以讓你這樣做。 一個是PowerMock 從他們的私有方法教程 ,你需要這樣的東西:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUnit.class)
public class TestMyUnit {

    @Test
    public void testSomething() {
        MyUnit unit = PowerMock.createPartialMock(MyUnit.class, "methodNameToStub");
        PowerMock.expectPrivate(unit, "methodNameToStub", param1).andReturn(retVal);

        EasyMock.replay(unit);

        unit.publicMethod(param1);

        EasyMock.verify(unit);

    }

}

但是,我自己真的不同意這種做法。 您的單元測試應該測試輸入,輸出和副作用,就是這樣。 通過確保正確調用私有方法,您所做的只是阻止您的代碼被輕松重構。

換句話說,如果你希望改變你的部隊如何完成工作呢? 執行此操作的安全方法是確保代碼在(傳遞)測試下,然后重構代碼(可能包括更改調用哪些內部方法),然后再次運行測試以確保您沒有破壞任何內容。 使用您的方法,這是不可能的,因為您的測試測試的確切實現,而不是單元本身的行為。 重構幾乎總會破壞測試,那么測試真正給你帶來了多少好處?

大多數情況下你會想要這樣做,因為你實際上是在考慮那些私有單位(這聽起來像你,因為你說你已經直接測試了那些私人方法!)。 如果是這種情況,最好將該邏輯提取到自己的類中,對其進行測試,然后在剩余的代碼中與該新單元的模擬/存根版本進行交互。 如果你這樣做,你的代碼有一個更好的結構,你不需要依靠伏擊魔法即PowerMock。 Michael Feathers“ 有效地使用遺留代碼 ”是一個很好的參考。

您可以檢查java檢測以執行此操作

作為解決方案之一,可以使用來自內部類的代理。 您需要在每個必須測試的類中添加內部類。 但對於大型產品項目來說,這不是很好的解決方案。 它需要創建添加腳本,用於從發布文件中刪除生成的類(jar / war)。

但更簡單的方法將使用PowerMock,如下面的評論(或上面:)) - http://code.google.com/p/powermock/wiki/MockPrivate

是否有可能向另一個對象提供私有方法被移動並公開的另一個對象? 在這種情況下,為該接口創建測試假人很容易。

如果調用正確的“私有方法”沒有可觀察到的外部結果,您確定要測試它嗎? 也許不應該。

如果最終結果是相同的,無論是否調用了私有方法,並且您仍希望觀察其調用,您可以將該方法設置為public並將其移動到自己的類,並模擬該類。 然后你可以驗證(使用Mockito或類似的框架)是否正在調用你的方法。

代碼覆蓋工具通過在實際運行測試之前重寫字節碼來完成此類操作。 所以,它必須是可能的,但這不是微不足道的。

更新:編寫一個單元測試,要求調用“正確”的私有方法,這樣才能重構一個真正的痛苦,因為那時你必須重新編寫所有的測試。 那種打敗了測試的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM