单测与全量测试执行时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
相关产品推荐
相关产品推荐

