2013-07-20 117 views
8

我有Java EE項目,我在其中使用Arquillian與JUnit進行的測試JBoss 7(Windows)。測試工作正常,但我無法調試它們。在IntelliJ中調試Arquillian測試

從我google搜索到的(https://community.jboss.org/wiki/WhyDontBreakPointsWorkWhenDebugging)我知道Arquillian測試正在單獨的VM中運行,因此IntelliJ無法調試它們。我需要IntelliJ通過套接字遠程連接到該機器,但我不知道該怎麼做。

我發現此線程:Debugging with Arquillian in IntelliJ - Managed Container但是我不知道如何讓它工作。

而且我跨過這個線程:http://devnet.jetbrains.com/message/5253623?tstart=0所以我在pom.xml中充滿希望appropriet萬無一失的一部分,但它沒有幫助:

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.4.3</version> 
     <configuration> 
      <debugForkedProcess>true</debugForkedProcess> 
     <skip>false</skip> 
    </configuration> 
</plugin> 

誰能公會我請如何調試在這樣的配置測試?

回答

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「>

<!-- 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

我使用託管容器。我試着玩你的建議,但是當開始調試時,我在控制檯中看到:「在地址:5005處偵聽傳輸dt_socket並且沒有更多事情發生。我發現它是因爲'susspend = y'參數。我想現在我應該讓IntelliJ連接到調試會話,但我不知道該怎麼做。 –

+1

最後我可以調試我的測試。我使用'mvn test -Parq-jbossas-managed'運行JBoss VM,然後在IntelliJ中使用遠程配置文件連接到該VM。是否有可能在Intellij中自動生成?我的意思是在連接之前運行'mvn test'? –

+0

我也想知道如何調試Arquillian測試,就像Idea IDE中的一個簡單單元測試 – zbig

1

我可以通過Maven或IntelliJ運行Arqullian測試,我使用嵌入容器,最重要的是配置JBoss hom e在arqullian.xml中,也不僅僅是在Maven配置中,IntelliJ知道JBoss home在哪裏。

<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配置。

IntelliJ Arequllian test configuration

這裏始終是可能性調試throught遠程調試。我喜歡在IDE上做。對我來說這是更舒適的方式。如果要啓用遠程調試,則必須將配置設置爲嵌入式容器的JAVA_OPT或arqullian.xml。