2

假设我正在检测一个类,我想在其中向方法的某些部分添加一些指令。例如,让我们考虑我想开发一个访问者V将方法中存在的方法调用指令重命名C.m()C.n()to 的情况C.n_detour()

什么是最简单的方法来测试运行后V是否C确实会得到预期的结果?我在这里谈论 xUnit 样式测试。

起初我以为我可以跑TraceMethodVisitor过去C,并将它与我自己的字符串进行比较,但结果发现有很多与我的测试无关的“装饰”指令(例如行号等)(见格式化 TraceClassVisitor 的输出)。

从理论上讲,我知道我可以让一些访问者运行并检查 a 的存在C.n_detour()和不存在C.n(),但我宁愿按照上述方法使用更多的东西(比较每条指令的指令)。

我查看了 ASM 的 Tree API,但它看起来并没有那么好,因为这些decoration指令也显示在那里。

有没有人过去使用 ASM 测试代码的经验?

4

1 回答 1

1

进行受保护,在测试用例C.n_detour()中扩展并计算调用次数。C

模式:你所有的检测都会产生一些新的副作用——这就是你首先检测的原因——所以编写测试来检查副作用是否存在。不要测试仪器的特定实现,而是测试一般的“它是否具有预期的效果”。

可能需要一个新的类加载器来将检测的版本C放在类路径上。

如果您使用 Maven,我建议在一个模块中进行检测并将测试放入第二个模块中。

于 2011-11-02T10:06:55.040 回答