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

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 学习建议

  1. 先夯实JUnit基础

    • 掌握JUnit 5核心注解:@Test、@BeforeEach、@AfterEach、@BeforeAll、@AfterAll、@DisplayName
    • 熟练使用断言:assertEquals、assertTrue、assertThrows等,理解断言的核心作用
  2. 吃透Mockito核心能力

    • 掌握mock对象创建:mock()方法、@Mock注解
    • 学会存根配置:when(...).thenReturn(...)、doReturn(...).when(...)(用于void方法)
    • 掌握验证逻辑:verify(xxx).method(...)、verify(xxx, times(n)).method(...)
    • 理解间谍(Spy)的用法:spy()包装真实对象,仅模拟指定方法
    • 建立“模拟外部依赖,聚焦核心逻辑测试”的思想
  3. SpringBoot集成阶段

    • 学会用@MockBean替换Spring容器中的真实Bean,用于Service层孤立测试
    • 掌握切片测试:@WebMvcTest测Controller、@DataJpaTest测DAO层、@ServiceTest(SpringBoot 3.1+)测Service
    • 明确@SpringBootTest的适用场景(启动完整容器的集成测试)
  4. 以实践为主

    • 从简单业务逻辑入手,比如测试Service类,模拟依赖的DAO层,验证方法调用次数、返回值、异常处理
    • 尝试参数化测试(JUnit 5的@ParameterizedTest),覆盖多场景用例
  5. 优先参考官方文档

    • 遇到问题优先查阅Mockito、JUnit 5、SpringBoot官方文档,信息准确性远高于第三方教程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:33