如何在开发javaagents时运行测试?

时间:2012-10-19 18:30:59

标签: java junit intellij-idea jvm profiling

我正试图摆弄Foursquare's HeapAudit,并尝试使用IntelliJ IDEA进行设置。我已经设法使用pom.xml中的依赖项来构建它。

然而,当我实际尝试运行JUnit测试时,基本上所有测试都失败了。我猜这是因为使用HeapAudit需要将JVM作为-javaagent启动,根据github:

$ java -javaagent:heapaudit.jar MyTest

如果我把这一行放进去,并且参考我先前下载/构建的heapaudit.jar,大概会通过测试。但是,在我看来,如果我对源进行更改,我将需要重新打包这个愚蠢的.jar文件,以查看它是否有效。

是否有任何方法可以使用-javaagent运行测试而无需完成编译的整个过程 - > package-into-jar每个测试周期?也许让IntelliJ在运行测试之前将新编译的.class文件作为-javaagent附加?

1 个答案:

答案 0 :(得分:4)

1)让一个罐子只有META-INF/MANIFEST.MF

清单必须使用Premain-Class和其他属性进行正确配置。 jar不需要任何其他文件。将此jar与-javaagent一起使用。如果代理类位于类路径中,则代理将正常启动。

maven-surefire-pluginforkMode=never一起使用时可能会失败,因为默认情况下,应用程序类会加载到子类ClassLoader中。

适用于Eclipse和Intellij。

如果这样做,请仔细检查清单语法(一旦我花了很长时间才发现包名称错误)。

2)使用ea-agent-loader

它允许您在运行时加载代理(任何代理)(它使用VM.attach())。但是VM.attach()有时会中断调试和断点可能无法触发。

forkMode = never

中的surefire会遇到同样的问题

3)在运行时加载代理。

将您的代码写入load the agent in runtime。从你的@BeforeClass中调用它你仍然需要一个jar(你可以在运行时生成它)。

你需要打电话给这个(只有一次):

AgentLoader.loadAgentClass(YourAgentClass.class.getName());