Mockito调用服务类方法时ResponseEntity始终为null的问题排查
问题原因分析
嘿,我来帮你捋捋这个问题!你遇到的是Mockito最基础的一个坑——@Mock注解创建的是一个“无行为”的mock对象,它不会自动调用真实类的方法逻辑,所有方法默认都会返回null(引用类型)或者对应基本类型的默认值(比如int返回0)。你只是创建了SomeService的mock实例,但完全没告诉Mockito:当调用getMethod()时应该返回什么,所以自然拿到的是null啦。
解决方法
根据你的测试需求,有两种常用的解决思路:
1. 指定Mock方法的返回值(最常用)
如果你只是想验证方法是否被调用,或者需要模拟特定返回值来测试上层逻辑,用when(...).thenReturn(...)来定义mock的行为就行:
修改后的测试类代码:
@RunWith(MockitoJUnitRunner.class) @Slf4j public class SomeServiceTest { @Mock SomeService someService; @Test public void getMethodSomeService(){ // 告诉Mockito:当调用someService.getMethod()时,返回我们指定的ResponseEntity ResponseEntity<?> mockResponse = new ResponseEntity<>("mock entity", HttpStatus.OK); when(someService.getMethod()).thenReturn(mockResponse); // 现在调用方法就能得到我们预设的返回值了 ResponseEntity<?> responseEntity = someService.getMethod(); log.debug("{}", responseEntity); } }
2. 调用真实的Service方法(测试真实逻辑)
如果你想测试SomeServiceImpl里的真实业务逻辑,那@Mock就不合适了,应该用**@Spy**来包装真实实例(或者直接创建真实对象,如果Service没有外部依赖的话):
用@Spy的示例:
@RunWith(MockitoJUnitRunner.class) @Slf4j public class SomeServiceTest { // @Spy会创建真实的SomeServiceImpl实例,默认调用真实方法逻辑 @Spy SomeService someService = new SomeServiceImpl(); @Test public void getMethodSomeService(){ ResponseEntity<?> responseEntity = someService.getMethod(); log.debug("{}", responseEntity); } }
如果你的Service有其他依赖(比如Dao层),还可以用Mockito.mock(SomeService.class, Mockito.CALLS_REAL_METHODS)来创建带真实方法调用的mock,不过@Spy写法更简洁。
额外小提示
你的测试类里加了@AutoConfigureMockMvc,这个注解是给Spring MVC集成测试用的(用来测Controller层),测试纯Service类完全不需要它,删掉就行啦。
内容的提问来源于stack exchange,提问作者yfluK
相关产品推荐
相关产品推荐

