我有一个项目在jboss 7.1.3上部署并使用arquillian进行测试,我正在尝试为其添加代码覆盖率指标。
我正在使用托管容器选项(jboss-as-arquillian-container-managed),现在我只是尝试将一个-javaagent参数添加到arquillian用来启动jboss的jvm参数中,所以我的arquillian.xml看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<defaultProtocol type="Servlet 3.0"/>
<engine>
<property name="deploymentExportPath">/tmp</property>
</engine>
<container qualifier="jboss" default="true">
<configuration>
<property name="outputToConsole">true</property>
<property name="jbossHome">[jboss home]</property>
<property name="javaHome">[java home]</property>
<property name="javaVmArguments">-Xmx2048m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Djboss.server.log.dir=logs -javaagent:[profile]\.m2\repository\org\jacoco\org.jacoco.agent\0.6.2.201302030002\org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=C:\jacoco.exec,includes=*,excludes=,append=true,output=file,classdumpdir=classdumpdir,dumponexit=true</property>
<property name="startupTimeoutInSeconds">120</property>
<property name="allowConnectingToRunningServer">true</property>
</configuration>
</container>
</arquillian>
我100%确定这个参数被选中,因为创建了jacoco.exec文件和classdumpdir。
问题是jacoco.exec文件为空。 jboss启动,测试运行并成功完成,jboss关闭,classdumpdir被填充(所以根据jacoco规范,这意味着它正确找到我的类)但是jacoco.exec仍然是完全空的。
如果我向完全相同的jboss提供确切的保存javaagent
参数,我自己手动启动一切正常。
我做错了什么?
答案 0 :(得分:1)
我最终将以下方法添加到我的测试类中:
@After
public void writeOutJacocoData() {
try {
Class rtClass = Thread.currentThread().getContextClassLoader().getParent().loadClass("org.jacoco.agent.rt.RT");
Object jacocoAgent = rtClass.getMethod("getAgent", null).invoke(null);
Method dumpMethod = jacocoAgent.getClass().getMethod("dump", boolean.class);
dumpMethod.invoke(jacocoAgent, false);
} catch(ClassNotFoundException e) {
logger.debug("no jacoco agent attached to this jvm");
} catch (Exception e) {
logger.error("while trying to dump jacoco data",e);
}
}
它的丑陋和野蛮(并使用jacoco类,他们不会在任何公开可用的jacoco文物中发布,因此反射)但是有效。