![](/img/trans.png)
[英]Can reflection be used to get a concrete implementing type (e.g. Class<? extends MyInterface>)?
[英]How to override instance/concrete class's method runtime? (e.g. reflection, cglib)
我想做的是一種可以
更具體地說,要覆蓋的父類XI包含
最初,我認為使用反射或類似方法非常簡單,然后我發現實現我的要求存在局限性。
我認為這是可以實現的,因為Mockito可以執行各種方法注入運行時。
請任何人給一些建議,謝謝。
我鏡像的偽代碼是這樣的:
createAndOverride(Class X) {
X newObj = X.newInstance(args) {
@override
methodOfX(args2) {
...
}
}
return newObj;
}
我打算測試一個類,該類具有幾個調用X1.get(),X2.get(),X3.get()的方法。
在某些測試案例中,我需要使Xn.get()返回我可以控制的測試內容(例如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.