我有Java EE项目,我在 JBoss 7 (Windows)上使用JUnit进行 Arquillian 测试。测试工作正常但我无法调试它们。
从我用Google搜索(https://community.jboss.org/wiki/WhyDontBreakPointsWorkWhenDebugging)我知道Arquillian测试正在单独的VM中运行,因此IntelliJ无法调试它们。我需要IntelliJ通过socket远程连接到那台机器,但我不知道该怎么做。
我找到了这个帖子:Debugging with Arquillian in IntelliJ - Managed Container但是我不知道如何让它发挥作用。
我也跨过了这个帖子:http://devnet.jetbrains.com/message/5253623?tstart=0所以我希望appropriet确实在我的pom.xml中找到了一部分,但它没有帮助:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<debugForkedProcess>true</debugForkedProcess>
<skip>false</skip>
</configuration>
</plugin>
请问有人如何在这样的配置下调试测试吗?
答案 0 :(得分:7)
首先取决于您使用的容器类型 - 托管,远程或嵌入式。另见https://docs.jboss.org/author/display/ARQ/Containers。对于后者,测试在同一JVM中运行,您可以直接在IDE中调试测试。
在这种情况下,Surefire配置并不重要,因为您希望在IDE中进行调试(除非您在IDE中执行maven目标)。
对于托管和远程容器,您需要调试实际容器。为此,您必须将正确的JVM选项传递给远程容器,以便您可以打开远程调试会话。一种方法是通过 arquillian.xml :
http://jboss.org/schema/arquillian/arquillian_1_0.xsd“&GT;
<!-- Need to set the default protocol and use resource filtering, because of https://issues.jboss.org/browse/ARQ-579 -->
<defaultProtocol type="Servlet 3.0"/>
<engine>
<property name="deploymentExportPath">target/artifacts</property>
</engine>
<container qualifier="incontainer">
<configuration>
<property name="jbossHome">${jbossTargetDir}</property>
<property name="javaVmArguments">-Xmx1024m -XX:MaxPermSize=512m -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005</property>
<property name="allowConnectingToRunningServer">true</property>
</configuration>
</container>
上面示例中的重要部分是 javaVmArguments 。
答案 1 :(得分:2)
我可以通过Maven或IntelliJ运行Arqullian测试。我使用嵌入式容器。最重要的是在arqullian.xml配置JBoss主页,也不仅仅在Maven配置中配置IntelliJ知道JBoss主页的位置。
<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">
<engine>
<property name="deploymentExportPath">testing/target/artifacts</property>
</engine>
<container qualifier="jbossas-managed" default="true">
<configuration>
<!-- JBoss embedded does not use this property
<property name="javaVmArguments">-java.util.logging.manager=org.jboss.logmanager.LogManager -Xmx512m -XX:MaxPermSize=256m -Djava.util.logging.manager=org.jboss.logmanager.LogManager</property>
-->
<property name="jbossHome">target/wildfly-8.1.0.Final</property>
<property name="modulePath">target/wildfly-8.1.0.Final/modules</property>
<property name="allowConnectingToRunningServer">true</property>
</configuration>
</container>
在IntelliJ中调试和运行测试的重要事项:
由于某种原因,您必须指定日志管理器才能运行嵌入式JBoss。对于Maven,它很简单,您可以将其设置为配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- Fork every test because it will launch a separate AS instance -->
<forkMode>always</forkMode>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
</systemPropertyVariables>
<redirectTestOutputToFile>false</redirectTestOutputToFile>
</configuration>
</plugin>
但IntelliJ并不关心Maven上的这些插件配置,您必须直接在测试用例配置中进行设置。我找不到更好的解决方案。嵌入式容器不关心arqullian.xml中的Java VM配置。
总是有可能通过远程调试进行调试。我喜欢在IDE上做。对我来说,这是更舒适的方式。如果要启用远程调试,必须将配置设置为嵌入式容器的JAVA_OPT,也不要设置为arqullian.xml。