Mockito测试报ExceptionInInitializerError及JUnit+Mockito+SpringBoot学习建议
问题解决与学习建议
一、ExceptionInInitializerError 报错解决方案
这个错误本质是静态代码块或静态变量初始化失败,结合你的场景,核心原因和解决步骤如下:
1. 依赖问题(最常见)
确保项目引入了正确的Mockito依赖,且版本与Java版本兼容:
- Java 8:使用Mockito 3.x或4.x版本
- Java 11+:使用Mockito 4.x及以上版本
如果是Maven项目,在pom.xml中添加:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <!-- 若用JUnit 5,需补充Mockito的JUnit 5扩展依赖 --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency>
2. 修正测试运行方式
你用main方法直接跑Mockito测试,未初始化Mockito的字节码增强环境,这是不规范的写法。改成标准JUnit测试结构:
package com.tutorialspoint.mock; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; public class PortfolioTester { Portfolio portfolio; StockService stockService; @BeforeEach public void setUp(){ portfolio = new Portfolio(); stockService = mock(StockService.class); portfolio.setStockService(stockService); } @Test public void testMarketValue(){ List<Stock> stocks = new ArrayList<>(); Stock googleStock = new Stock("1","Google", 10); Stock microsoftStock = new Stock("2","Microsoft",100); stocks.add(googleStock); stocks.add(microsoftStock); portfolio.setStocks(stocks); when(stockService.getPrice(googleStock)).thenReturn(50.00); when(stockService.getPrice(microsoftStock)).thenReturn(1000.00); double marketValue = portfolio.getMarketValue(); assertEquals(100500.0, marketValue); } }
注意:把测试类放在
src/test/java目录下,和src/main/java的业务代码分离,避免类路径冲突。
3. 排查类路径冲突
如果上述两步无效,检查项目是否存在多版本Mockito、ByteBuddy或ASM依赖(Mockito底层依赖),用Maven的dependency:tree命令查看依赖树,手动排除冲突依赖。
二、JUnit+Mockito+SpringBoot 学习建议
先夯实JUnit基础
- 掌握JUnit 5核心注解:
@Test、@BeforeEach、@AfterEach、@BeforeAll、@AfterAll、@DisplayName - 熟练使用断言:
assertEquals、assertTrue、assertThrows等,理解断言的核心作用
- 掌握JUnit 5核心注解:
吃透Mockito核心能力
- 掌握mock对象创建:
mock()方法、@Mock注解 - 学会存根配置:
when(...).thenReturn(...)、doReturn(...).when(...)(用于void方法) - 掌握验证逻辑:
verify(xxx).method(...)、verify(xxx, times(n)).method(...) - 理解间谍(Spy)的用法:
spy()包装真实对象,仅模拟指定方法 - 建立“模拟外部依赖,聚焦核心逻辑测试”的思想
- 掌握mock对象创建:
SpringBoot集成阶段
- 学会用
@MockBean替换Spring容器中的真实Bean,用于Service层孤立测试 - 掌握切片测试:
@WebMvcTest测Controller、@DataJpaTest测DAO层、@ServiceTest(SpringBoot 3.1+)测Service - 明确
@SpringBootTest的适用场景(启动完整容器的集成测试)
- 学会用
以实践为主
- 从简单业务逻辑入手,比如测试Service类,模拟依赖的DAO层,验证方法调用次数、返回值、异常处理
- 尝试参数化测试(JUnit 5的
@ParameterizedTest),覆盖多场景用例
优先参考官方文档
- 遇到问题优先查阅Mockito、JUnit 5、SpringBoot官方文档,信息准确性远高于第三方教程
内容的提问来源于stack exchange,提问作者bhargava
相关产品推荐
相关产品推荐

