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

