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

Mockito测试中构建含Cars数组的HttpResponse解决空指针问题

解决Mockito测试中HttpResponse.getBody()空指针异常的问题

嘿,我看到你刚接触Mockito,在测试GET请求时遇到了空指针异常,问题出在response.getBody()返回null导致for循环没法遍历对吧?别担心,我来帮你一步步搞定这个问题。

首先,咱们得明确根源:你虽然Mock了HttpResponse<Cars[]>对象,但没有给它的getBody()方法设置返回值,所以当代码调用这个方法时,默认返回null,自然就触发空指针了。

接下来我给你详细的修正方案:

1. 先造好虚拟的Cars对象数组

咱们需要先创建实际的Cars对象数组,这样才能让HttpResponse的getBody()返回有效数据。比如写个方法生成测试用的数组:

private Cars[] getDummyCarsArray() {
    // 创建两个测试用的Cars对象
    Cars toyota = new Cars();
    toyota.setCarId("1");
    toyota.setCarname("Toyota Camry");
    
    Cars honda = new Cars();
    honda.setCarId("2");
    honda.setCarname("Honda Civic");
    
    return new Cars[]{toyota, honda};
}

2. 给Mock的HttpResponse配置getBody()返回值

你已经Mock了HttpResponse<Cars[]>,现在要告诉它调用getBody()时返回咱们刚才造的数组:

Mockito.when(httpresponse.getBody()).thenReturn(getDummyCarsArray());

3. 调整测试逻辑(这步很关键!)

看你原来的测试代码,你错误地Mock了carsUser.getCars()的返回值——但咱们要测试的就是这个方法的逻辑啊,不能直接Mock它的结果。正确的做法应该是:

  • 让carsUser使用咱们Mock好的carsProvider(通过构造方法或者Setter注入进去)
  • 配置carsProvider.getCars()返回咱们已经设置好的HttpResponse
  • 调用carsUser.getCars(),然后验证业务逻辑是否正常运行

修正后的完整测试类代码如下:

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
import static org.junit.Assert.assertEquals;

public class TestClass {
    @Mock
    private HttpResponse<Cars[]> httpresponse;
    @Mock
    private CarsProvider carsProvider;
    // 注意:这里不要Mock CarsUser,我们要测试它的真实实现
    private CarsUser carsUser;

    @Before
    public void setUp() {
        // 初始化所有Mock对象
        MockitoAnnotations.initMocks(this);
        // 将Mock的carsProvider注入到carsUser中(假设CarsUser有对应的构造方法)
        carsUser = new CarsUser(carsProvider);
    }

    @Test
    public void getCarsTest() {
        // 第一步:配置HttpResponse的getBody()返回虚拟数组
        when(httpresponse.getBody()).thenReturn(getDummyCarsArray());
        // 第二步:配置carsProvider调用getCars时返回咱们Mock好的HttpResponse
        when(carsProvider.getCars(anyString(), anyString())).thenReturn(httpresponse);
        
        // 第三步:调用要测试的方法
        List<Cars> resultCars = carsUser.getCars("test-id", "test-name");
        
        // 第四步:验证结果是否符合预期(比如数组里有2个元素,返回的List也应该有2个)
        assertEquals(2, resultCars.size());
        // 还可以验证具体的属性值,比如第一个车的名字是否正确
        assertEquals("Toyota Camry", resultCars.get(0).getCarname());
    }

    private Cars[] getDummyCarsArray() {
        Cars toyota = new Cars();
        toyota.setCarId("1");
        toyota.setCarname("Toyota Camry");
        
        Cars honda = new Cars();
        honda.setCarId("2");
        honda.setCarname("Honda Civic");
        
        return new Cars[]{toyota, honda};
    }
}

额外提个小问题

我看到你CarProvider类的getCars方法里有个笔误:queryString("carId",cardId)这里的cardId应该是参数名carId,这个小错误在实际运行时会导致参数传递错误,记得修正哦!

这样调整之后,当carsUser.getCars()调用response.getBody()时,就会拿到我们预先设置好的Cars数组,for循环就能正常遍历,空指针异常也就解决啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:53