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

SpringBoot Mockito单元测试配置when..thenReturn仍抛出异常问题求助

问题根因

  • mock对象未注入到被测试实例:ConvertService的构造函数中硬编码调用ConvertFactory.of("dev", "F")生成convertUtility实例,测试类中声明的mockConvertUtility完全没有被用到,你配置的mock返回规则自然不会生效,运行时调用的是真实对象的transform方法。
  • Mock配置存在语法错误:when(convertUtility.transform(any(String.class)).thenReturn(context);缺少右括号,正确写法应为when(convertUtility.transform(any(String.class))).thenReturn(context);
  • 测试注解混用冲突:@SpringBootTest是Spring Boot集成测试注解,和纯单元测试用的@RunWith(MockitoJUnitRunner.class)混用会导致Mock注解失效。
  • 第三方类限制:如果ConvertUtility是final类或者transform是final方法,Mockito默认无法对这类方法做mock,会直接执行真实逻辑。

修复方案

  1. 重构ConvertService,将ConvertUtility改为构造函数注入,消除硬编码依赖:
@Service
public class ConvertService {

  private final NetworkClient networkClient; 
  private final ConvertUtility convertUtility; 

  // 把ConvertUtility作为构造参数传入,由Spring容器注入
  public ConvertService(NetworkClient networkClient, ConvertUtility convertUtility) {
    this.convertUtility = convertUtility;
    this.networkClient = networkClient;
  }

  public Response convert(Request request) {
    User user = networkClient.getData(request.getId());
    Context context = convertUtility.transform(request.getToken());
    // 其余业务逻辑
  }
}

添加Spring配置类,注册ConvertUtility为全局Bean:

@Configuration
public class ConvertConfig {
    @Bean
    public ConvertUtility convertUtility() {
        return ConvertFactory.of("dev", "F");
    }
}
  1. 修正测试类逻辑,清理无效注解,将mock对象传入被测试实例:
// 纯单元测试不需要@SpringBootTest注解
@RunWith(MockitoJUnitRunner.class)
class ConvertServiceTest {

  @Mock
  private NetworkClient networkClient;

  @Mock
  ConvertUtility convertUtility;

  private ConvertService convertService;

  @BeforeEach
  void setUp() {
    // 把两个mock对象都传入构造函数
    convertService = new ConvertService(networkClient, convertUtility);
  }

  @Test
  void testConvertSuccess() {
    Request request = new Request(1000);
    User user = new User("user1");
    Context context = new Context();

    when(networkClient.getData(anyLong())).thenReturn(user);
    // 修正语法错误,补全括号
    when(convertUtility.transform(any(String.class))).thenReturn(context);
     
    Response response = convertService.convert(request);
    // 此处添加业务断言验证结果
  }
}
  1. 如果确认ConvertUtility是final类或者transform是final方法,需要开启Mockito对final类的mock支持:
    在项目src/test/resources/mockito-extensions目录下创建名为org.mockito.plugins.MockMaker的文件,写入内容:
mock-maker-inline

即可实现对final类、final方法的mock。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:45:07