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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:58:14