0

我对JUnit和Javassist的了解比较浅,只是想用它们来做一些程序分析。例如,给定一个库,我想知道在运行时调用了库中的哪些方法。我可以使用字节码操作来插入 system.out.println("method_name"); 在方法的开头声明。所以在运行时,它会打印出调用了哪些方法。

在独立应用程序中,我可以在调用 main() 之前拦截并使用我自己的类加载器(见下文),但是在 JUnit 中没有 main(),谁能告诉我在这种情况下如何拦截?非常感谢。

...
  Loader loader = new Loader( pool );
  loader.addTranslator( pool, xlat );
  loader.run( className, args );
...

编辑:我使用 JUnit 4.8 和 Javassist 3.15.0.GA

4

1 回答 1

0

我可以推荐一种替代方法吗?您可以改用面向方面的方法,使用AspectJ。这样,您可以围绕要监视的部分或所有方法定义切入点。

另一种选择是,如果您正在寻找监控代码覆盖率(事实上您正在使用 JUnit 并且只是想要做System.out.println(...)这件事就是很好的提示),也许您正在寻找代码覆盖率工具?如果是这样,Cobertura将是您最好的选择 - 无需自定义编码。

这两个选项都有自己的字节码操作,但不需要开发人员维护。

如果您使用 Eclipse 作为您的 IDE,那么这两者都可以很好地与 Eclipse 结合使用。AspectJ 实际上是一个 Eclipse 项目,但不需要 Eclipse。Cobertura 的 Eclipse 插件是eCobertura

另一种选择是在 JUnit 本身内完成 - 这不需要任何字节码操作。看看它的TestWatchman类。我还没有像使用其他库那样在线记录此内容,但您可以查看我的BaseTest类作为我的JUnit 实用程序库的一部分。任何扩展它的 JUnit 测试类都会在每个测试开始、成功或失败时自动记录(到 SLF4J)。但是,这一切都只是在测试级别,并且无助于监控每个测试运行的其他方法。

于 2011-12-10T15:13:37.613 回答