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

单测与全量测试执行时Mockito错误不一致问题

Java 11项目单元测试执行一致性问题

问题概述

我负责的Java 11项目包含数千个单元测试,部分测试使用Mockito库。执行mvn test全量测试时,结果如下:

[ERROR] Tests run: 26987, Failures: 0, Errors: 6, Skipped: 0

存在6个单元测试错误,且出现两个异常现象:

  • 移除这6个报错测试后,会出现另外6个新的错误;
  • 通过-Dtest单独执行测试类时,所有测试均能正常运行。

所有报错类型均为InvalidUseOfMatchers或UnfinishedStubbing。我推测问题源于测试上下文泄漏、冲突或执行顺序影响,但我的核心目标不是解决错误本身,而是让两种测试执行方式的结果保持一致——要么单独执行时能复现错误,要么全量执行时全部通过。两种执行模式使用的surefire版本一致。

测试代码与依赖情况

测试类均为无额外注解的公共类,每个测试方法都标注@Test注解,类实例在测试方法内部创建。以下是报InvalidUseOfMatchers错误的示例测试代码:

@Test
public void checkEndDate_validatesEndDateIsSet() {
    // 创建Timestamp的mock对象
    Timestamp mockEndDate = Mockito.mock(Timestamp.class);

    // 创建PerformancePeriodVO实例
    PerformancePeriodVO performancePeriod = new PerformancePeriodVO();

    // 赋值mock的Timestamp对象
    performancePeriod.setEndDate(mockEndDate);

    // 验证getEndDate返回非空值
    Assertions.assertNotNull(performancePeriod.getEndDate(), "End date should not be null");
}

项目POM中单元测试相关依赖配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

更新补充:完整报错测试类

以下完整测试类中,getHash_testGetHashSameInstance方法在全量测试时首行报错,但单独执行该类时无任何错误:

package it.dap.nw.commons.db;

import java.lang.reflect.Field;
import java.util.Hashtable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
import org.mockito.Mockito;

public class PropertyOverrideTest {
    @Test
    public void getHash_testGetHashNotNull() {
        Hashtable hashMock = Mockito.mock(Hashtable.class);
        PropertyOverride.setHash(hashMock);
        Hashtable result = PropertyOverride.getHash();
        Assertions.assertNotNull(result);
    }


    @Test
    public void getHash_testGetHashSameInstance() {
        Hashtable hashMock = Mockito.mock(Hashtable.class);
        try {
            Field field = PropertyOverride.class.getDeclaredField("hash");
            field.setAccessible(true);
            field.set(null, hashMock);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        Hashtable result = PropertyOverride.getHash();
        Assertions.assertEquals(hashMock, result, "Expected same instance of Hashtable");
    }


    @Test
    public void setHash_testSetHashNotNull() {
        Hashtable hashMock = Mockito.mock(Hashtable.class);
        PropertyOverride.setHash(hashMock);
        Assertions.assertEquals(hashMock, PropertyOverride.getHash());
    }


    @Test
    public void setHash_testSetHashNull() {
        Hashtable hashMock = Mockito.mock(Hashtable.class);
        PropertyOverride.setHash(null);
        Assertions.assertNull(PropertyOverride.getHash());
    }
}

注:我并非该项目原开发者,Java开发经验有限,可提供更多相关信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:22:08