2011-11-02 33 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创建另一个项目。在同一个项目中做这两件事是可能的,但很笨拙。 –