调试maven测试时Intellij idea调试器断开连接

调试maven测试时Intellij idea调试器断开连接,maven,junit,intellij-idea,Maven,Junit,Intellij Idea,我已通过Intellij Idea按照此链接调试maven测试: 当到达第三步并开始调试时,它已连接但很快断开连接,并且不会在断点处停止。我在Intellij有: 已连接到目标VM,地址:'localhost:5005',传输:'socket' 已断开与目标VM的连接,地址:'localhost:5005',传输:'socket' 有什么想法吗?唯一阻止idea调试Maven目标的是分叉 默认情况下,surefire和spring boot等插件使用的是forking 所以,当您从IDEA开始调

我已通过Intellij Idea按照此链接调试maven测试:

当到达第三步并开始调试时,它已连接但很快断开连接,并且不会在断点处停止。我在Intellij有:

已连接到目标VM,地址:'localhost:5005',传输:'socket'

已断开与目标VM的连接,地址:'localhost:5005',传输:'socket'


有什么想法吗?

唯一阻止idea调试Maven目标的是分叉

默认情况下,surefirespring boot等插件使用的是forking

所以,当您从IDEA开始调试maven目标时,它会连接到maven,但您真正想要调试的进程与maven进程不同,所以它不会连接

要在surefire插件中防止此类行为,您应该阅读本文:

简言之:

如果使用旧的surefire:

<configuration>
    <forkMode>never</forkMode>
</configuration>
<configuration>
    <forkCount>0</forkCount>
</configuration>

从未
在new surefire中:

<configuration>
    <forkMode>never</forkMode>
</configuration>
<configuration>
    <forkCount>0</forkCount>
</configuration>

0
但不太清楚:

  • 在CI的情况下(我希望您使用CI工具),您不必防止分叉,因为它非常慢
  • 如果您将您的项目发送给其他人—如果某些模块以非默认方式运行,他们将不会高兴
  • 所以,如果您想取悦CI、IDEA、联合开发人员和您自己,您应该提供更智能的方法来允许调试您的构建

    我的建议是:

  • 默认行为是分叉的,因为构建过程是非常常见的事情,而调试过程则是例外

  • 调试器行为与易于使用的“打开”隔离

  • 我的变体:

    <properties>
        <test.forkCount>1</test.forkCount>
    </properties>
    <profiles>
          <profile>
                <id>debug</id>
                 <properties>
                         <test.forkCount>0</test.forkCount>    
                 </properties>
            </profile>
     </profiles>
     <build>
          <plugins>
               <plugin>
                    <!-- surefire -->
                    <configuration>
                        <forkCount>${test.forkCount}</forkCount>
                    </configuration>
                </plugin>
            </plugins>
    </build>
    
    
    1.
    调试
    0
    ${test.forkCount}
    
    所以,在IDEA中,您只需要使用目标test创建命名运行配置,并将debug包含到概要文件列表中

    但在其他情况下,maven的行为仍然是默认的

    其中是附加利润-您可以在单个概要文件中包含整个调试行为

    例如,在我的real project调试配置文件中:

  • 关闭弹簧靴上的分叉:运行
  • 关闭JaCoCo覆盖范围(需要在surefire上分叉)
  • 保持本地构建Docker映像,但防止推送到注册表
  • 保持完整的打包过程,但防止向nexus发布
  • 将SOAP UI功能测试重定向到特定URL以进行本地调试
  • 将DBCONFIG重定向到基于docker的Postgres,该Postgres“始终为空”
  • 将log4j的日志级别降级为调试
  • 因此,如果我使用
    mvn-pdebug
    ,我确信我的环境和进程确实是debug


    但是如果我在CI上运行
    mvn deploy
    ,我将获得构建过程的完整堆栈。

    您的测试成功启动了吗?如果它没有到达任何断点,可能是因为您的代码没有运行。@Guillaume Darmont我在到达测试时使用“mvn test-Dmaven.surefire.debug”运行代码,我在命令行中有:---------------------------------------------------------------T E S T S---------------------------------------------侦听地址为5005的传输dt_套接字,因此我开始使用I idea进行调试,它很快断开连接,命令行仍在“侦听地址为5005的传输dt_套接字”中我也有同样的问题。您设法解决了吗?使用maven surefire debug
    -Dmaven.surefire.debug-DforkCount=0添加-DforkCount=0对我很有效