使用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
相关产品推荐
相关产品推荐

