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

使用Mockito测试Controller时出现实例为null问题如何解决

问题原因

你当前的配置没有启用Mockito的注解解析逻辑,@Mock和@InjectMocks注解不会被自动处理,因此adminController和service都没有完成初始化,自然为null。你手动new控制器实例的时候,没有关联mock的service,自然也没法完成注入。

解决方法

根据你使用的JUnit版本选择对应方案即可:

方案1:JUnit 4 场景

把测试类上的@RunWith(JUnitPlatform.class)替换为@RunWith(MockitoJUnitRunner.class),Mockito会自动完成mock对象创建和依赖注入:

@RunWith(MockitoJUnitRunner.class)
public class AdminControllerTest {

  @Mock
  private AdminService service;

  @InjectMocks
  private AdminController adminController;

  @Test
  public void registerUser() {
    // 先定义mock service的返回逻辑,否则service调用会返回默认值
    when(service.register(any())).thenReturn(true);
    Boolean resultReal = adminController.registerUser();
    assertTrue(resultReal);
  }
}

方案2:不修改Runner的兼容方案

如果不想更换测试Runner,可以在测试前置方法中手动触发Mockito注解初始化:

@RunWith(JUnitPlatform.class)
public class AdminControllerTest {

  @Mock
  private AdminService service;

  @InjectMocks
  private AdminController adminController;

  @Before
  public void initMockito() {
    // 触发所有Mockito注解的初始化逻辑
    MockitoAnnotations.openMocks(this);
  }

  @Test
  public void registerUser() {
    when(service.register(any())).thenReturn(true);
    Boolean resultReal = adminController.registerUser();
    assertTrue(resultReal);
  }
}

方案3:JUnit 5(Jupiter)场景

如果使用JUnit 5,不需要使用@RunWith注解,替换为Mockito的扩展即可,同时需要确保项目引入了mockito-junit-jupiter依赖:

@ExtendWith(MockitoExtension.class)
public class AdminControllerTest {

  @Mock
  private AdminService service;

  @InjectMocks
  private AdminController adminController;

  @Test
  public void registerUser() {
    when(service.register(any())).thenReturn(true);
    Boolean resultReal = adminController.registerUser();
    assertTrue(resultReal);
  }
}

注意事项

  • 你需要提前给mock的service定义调用返回规则,否则service方法会返回null或者基础类型默认值,可能导致测试结果不符合预期
  • 建议AdminController使用构造函数注入的方式引入Service,Mockito会优先通过构造函数完成依赖注入,兼容性最好,也符合Spring的官方推荐规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:07