You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven构建成功但IDE手动运行测试失败,如何排查原因?

问题排查:Maven CLI构建测试通过但IDE运行测试失败的不一致问题

当前环境

Apache Maven 3.8.1
Maven home: /Users/deyb/.sdkman/candidates/maven/current
Java version: 1.8.0_342, vendor: Azul Systems, Inc., runtime: /Users/myuser/.sdkman/candidates/java/8.0.342-zulu/zulu-8.jdk/Contents/Home/jre
Default locale: en_PH, platform encoding: US-ASCII
OS name: "mac os x", version: "12.3", arch: "aarch64", family: "mac"

环境说明:通过SDKMAN在Mac M1上安装JDK和Maven。

问题现象

使用Maven构建项目时,构建成功且显示所有测试通过;但在IDE中手动运行预期会失败的测试类com.sample.MySampleTest时,测试结果显示失败,二者表现不一致(预期该测试失败,但Maven构建仍成功)。

测试代码片段

import junit.runner.Version;
...
Set<ConstraintViolation<MySample>> violations = validator.validate(dto);
        log.info("violations count >>> {}", violations.size());
        log.info("JUnit version is: " + Version.id());
        assertThat(violations, hasSize(1));

Maven构建日志

08:04:22.880 [main] INFO  c.s.MySampleTest - violations count >>> 1
08:04:22.880 [main] INFO  c.s.MySampleTest - JUnit version is: 4.12
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 sec

IDE运行失败日志

08:05:03.431 [main] INFO  c.s.MySampleTest - violations count >>> 0
08:05:03.431 [main] INFO  c.s.MySampleTest - JUnit version is: 4.12

java.lang.AssertionError: 
Expected: a collection with size <1>
     but: collection size was <0>

    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.junit.Assert.assertThat(Assert.java:956)
    at org.junit.Assert.assertThat(Assert.java:923)

已尝试的操作及结果

  • 统一IntelliJ bundled Maven与SDKMAN的Maven版本,Maven构建仍显示测试全过;
  • 移除所有Maven安装,改用IDE bundled Maven并配置环境变量,Maven构建仍成功;
  • 在IntelliJ中运行com.sample包、com包、模块级别的所有测试,均显示MySampleTest失败(符合预期);
  • 通过brew重装Maven,Maven构建仍成功;
  • 删除.m2仓库中的JUnit目录并重新下载,执行mvn clean install仍显示构建成功;
  • 在Linux构建服务器上执行mvn clean install,构建失败并指出该测试错误;
  • 添加测试用例Assert.assertEquals(true, false);,Maven构建失败但仅报告该测试错误,未提及MySampleTest;
  • 模块pom中已显式声明JUnit版本,通过junit.runner.Version.id()确认版本一致。

进一步排查方法

  1. 检查Maven Surefire插件配置

    • 查看pom.xml中maven-surefire-plugin的配置,确认是否存在测试类过滤规则(includes/excludes),是否意外排除了MySampleTest;
    • 检查是否设置testFailureIgnore=true,该配置会让Maven忽略测试失败;
    • 执行mvn clean test -X查看Surefire插件的详细日志,确认实际执行的测试类列表,验证是否真的运行了MySampleTest。
  2. 对比Maven与IDE的类路径差异

    • 执行mvn dependency:tree输出依赖树,与IDE中显示的依赖树对比,重点检查Bean Validation(如Hibernate Validator)相关依赖的版本差异;
    • 检查Maven构建时的系统属性、环境变量,是否存在影响Validator行为的启动参数(如javax.validation.validation-mode);
    • 在测试类中添加代码,输出当前类加载器加载的Validator相关类的来源,对比Maven和IDE的输出,确认是否加载了不同版本的类。
  3. 排查测试执行的上下文差异

    • 执行mvn help:active-profiles查看激活的Maven profile,检查profile中是否有修改测试配置或依赖的设置;
    • 检查测试类中是否存在依赖环境的逻辑(如文件路径、系统属性),确认Maven构建环境与IDE是否存在差异;
    • 尝试在Maven中单独运行该测试:mvn clean test -Dtest=MySampleTest,观察输出是否与IDE一致。
  4. 检查Mac M1架构兼容性问题

    • 验证Bean Validation相关依赖是否适配aarch64架构,是否在M1上运行时校验逻辑出现异常;
    • 尝试在Maven构建时添加JVM参数强制使用x86_64架构(如mvn clean install -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/libexec/java_home -v 1.8 -a x86_64/bin/javac),看是否能复现测试失败。
  5. 调整Surefire插件版本

    • 确认当前使用的maven-surefire-plugin版本,尝试升级或降级(如切换到2.22.2或3.0.0-M5版本),观察是否解决测试执行不一致问题。

内容的提问来源于stack exchange,提问作者geneqew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:17:39