簡體   English   中英

如何重寫實例/具體類的方法運行時? (例如反射,cglib)

[英]How to override instance/concrete class's method runtime? (e.g. reflection, cglib)

我想做的是一種可以

  • 生成X類的實例(在arg中傳遞的類變量),然后
  • 覆蓋某些方法

更具體地說,要覆蓋的父類XI包含

  • 不包含默認構造函數(例如,所有帶有args的構造函數)
  • 構造函數在同一類中調用非私有方法

最初,我認為使用反射或類似方法非常簡單,然后我發現實現我的要求存在局限性。

我認為這是可以實現的,因為Mockito可以執行各種方法注入運行時。
請任何人給一些建議,謝謝。
我鏡像的偽代碼是這樣的:

createAndOverride(Class X) {
    X newObj = X.newInstance(args) {
        @override
        methodOfX(args2) {
            ...
        }
    }
    return newObj;
}
  • 原始問題場景

我打算測試一個類,該類具有幾個調用X1.get(),X2.get(),X3.get()的方法。
在某些測試案例中,我需要使Xn.get()返回我可以控制的測試內容(例如null)
由於以下限制:

  • 但是由於模擬工具對JMock 1.0的限制(我沒有控制:(),所以我不能簡單地模擬Xn.get()來返回“ someSpecifiedObjects”
  • Xn沒有null構造函數,並且構造函數調用非私有成員

我的解決方法是自制Xn類,並將其傳遞給測試用例,以使Cn.get()可以預期
代碼示例:

ClassToTest.SomeMethod(new X1() {
    @override
    get() {
        return someSpecifiedObjects;
    }
});

這種事情散布在測試用例上。
因此,為了減少重復的代碼,我想構建一種使用指定的重寫方法來生成Xn實例以進行測試的方法。 例如

X1 x1 = createAndOverride(X1);

然后,這個帖子的問題來了

您在尋找類似javassist的東西嗎? 您可以檢測代碼並在運行時注入方法。 我個人嘗試盡可能避免字節碼操作。 您能否在代碼庫中擁有這些替代品,而不是立即進行操作? 可能像包裝紙一樣?

所以我認為您需要的是與C#的Reflection.Emit類似的功能:

盡管我自己還沒有完成此操作,但我認為您應該能夠使用反射/發射和動態類型創建來實現所需的功能。 但是,我仍然想提一提,如果您要測試的不是“功能”,那不是您要測試的函數的代碼路徑,那么您可能根本不應該對其進行測試。 例如:

SomeObjectInterface get()
{
    if(_someObjectStateIsSet)
    {
        // Return a concrete implementation A
        return new ConcreteImplA();
    }
    else
    {
        // Return a concrete implementation B
        return new ConcreteImplB();
    }
}

在這種情況下,get沒有返回null代碼路徑,因此您不需要測試null 我不確定我是否100%正確地理解了您的問題,尤其是為什么要測試null ,但是請考慮以上建議並查看對您有用的方法。

暫無
暫無

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

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