在JUnit测试中使用Javassist

时间:2011-12-10 15:10:31

标签: java junit javassist

我对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

1 个答案:

答案 0 :(得分:0)

我可能会推荐替代方法吗?您可以使用AspectJ来使用面向方面的方法。有了它,您可以围绕要监视的子集或所有方法定义切入点。

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

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

如果您使用Eclipse作为IDE,那么这两者都非常适合Eclipse。 AspectJ实际上是一个Eclipse项目,但不需要Eclipse。 Cobertura的Eclipse插件是eCobertura

另一个选择是在JUnit本身内完成 - 这不需要任何字节码操作。看看它的TestWatchman课程。我没有像在其他图书馆那样在线记录此文件,但您可以查看我的BaseTest课程作为JUnit utilities library的一部分。任何扩展它的JUnit测试类将在每次测试开始,成功或失败时自动记录(到SLF4J)。但是,这只是测试级别,并且无法监视每个测试运行的其他方法。