2011-11-02 27 views
2

假設我正在測試一個類,在該類中我想向方法的某些部分添加一些指令。例如,我們考慮一下這樣一種情況,我希望開發訪問者V以將方法C.m()中存在的方法調用指令從C.n()更改爲C.n_detour()使用ASM進行測試Bytecode

運行V超過C後,最簡單的測試方法是什麼?我在這裏談論xUnit風格測試。

起初,我以爲我可以在C運行TraceMethodVisitor,並將它與我自己的字符串,但事實證明是有很多的在很大程度上是「裝飾」的指令(如行號等)與我的測試無關(請參閱Formatting the output of a TraceClassVisitor)。

理論上我知道我可以讓一些訪問者運行並檢查C.n_detour()的存在和C.n()的不存在,但我寧願使用更多的東西(比較指令每條指令)。

我看了一下ASM的Tree API,但看起來並沒有那麼好,因爲那些decoration指令也出現在那裏。

有沒有人有過去使用ASM測試代碼的經驗?

回答

1

使C.n_detour()受保護,在測試用例中擴展C並計算調用次數。

模式:您的所有儀器都會產生一些新的副作用 - 這就是爲什麼您首先進行檢測的原因 - 因此請編寫檢查副作用是否存在的測試。不要測試儀器的具體實現,但對於一般的「它是否具有預期的效果」。

可能需要一個新的類加載器將C的測試版本放在類路徑中。

如果您使用Maven,我建議在一個模塊中進行測試並將測試放入第二個模塊中。

+0

這看起來確實是個好主意。 –

+0

我知道爲什麼我沒有想到過。問題是,目前沒有簡單的方法讓整個班級都能正常工作。試圖運行.class文件會產生錯誤。我從(仍然)不存在的類調用方法! –

+1

然後按照我的第二條建議:創建一個項目,創建一個JAR,並將所有已檢測的類作爲輸出。使用測試過的JAR創建另一個項目。在同一個項目中做這兩件事是可能的,但很笨拙。 –