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

使用MockBean执行测试时触发java.lang.NullPointerException的原因及解决

问题原因及解决方案

问题根源

你测试代码里的MyService是手动new出来的,并且用了Mockito的@Mock注解,这个对象不受Spring容器管理,因此Spring不会自动注入dependedService,导致调用方法时出现空指针异常。同时@MockBean虽然创建了依赖服务的mock实例,但因为MyService不是Spring托管的Bean,无法获取到这个mock实例。

解决方案一:基于Spring上下文的集成测试(适合需要事务等Spring特性的场景)

使用@Autowired注入Spring管理的MyService实例,配合@MockBean替换依赖的DependedService,这样Spring会自动把mock的依赖注入到MyService中:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTests {          
        
    @Autowired
    private MyService myService;
    
    @MockBean
    private DependedService dependedService;
        
    @Test
    public void testSaveMyDetails() {
        Integer someId = 1;
        List<String> someList = new ArrayList<>();
        
        // 明确指定依赖方法的行为(默认mock方法调用就是doNothing,可省略)
        doNothing().when(dependedService).saveSomething(Mockito.anyInt(), Mockito.anyList());                           
        
        boolean result = myService.saveMyDetails(someId, someList);
        assertEquals(true, result);
    }
}

解决方案二:纯单元测试(无需启动Spring上下文,更高效)

使用Mockito的@InjectMocks和@Mock注解,让Mockito自动将mock的依赖注入到MyService中,无需依赖Spring容器:

@ExtendWith(MockitoExtension.class)
public class MyServiceTests {          
        
    @InjectMocks
    private MyService myService; // Mockito自动注入@Mock标记的依赖
    
    @Mock
    private DependedService dependedService;
        
    @Test
    public void testSaveMyDetails() {
        Integer someId = 1;
        List<String> someList = new ArrayList<>();
        
        doNothing().when(dependedService).saveSomething(Mockito.anyInt(), Mockito.anyList());                           
        
        boolean result = myService.saveMyDetails(someId, someList);
        assertEquals(true, result);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:42:23