如何Mock无Getter的restFb Connection<AdsInsights>对象?
解决restFb Connection Mock时的空指针问题
你遇到的空指针异常,核心原因是直接遍历Connection对象时,Mockito生成的默认Mock对象未正确实现iterator()方法。仅MockgetData()不足以支持增强for循环或迭代器遍历,需补充Mock迭代相关方法。
正确的Mock步骤
1. 准备测试数据
先构造模拟的AdsInsights列表:
import java.util.Arrays; import java.util.List; import com.restfb.types.ads.AdsInsights; List<AdsInsights> mockInsightsList = Arrays.asList( new AdsInsights(), // 可根据测试需求设置具体字段值 new AdsInsights() );
2. Mock Connection对象
需同时MockgetData()和iterator()方法,确保遍历行为正常:
import com.restfb.Connection; import org.mockito.Mockito; Connection<AdsInsights> mockConnection = Mockito.mock(Connection.class); // Mock getData() 返回测试列表 Mockito.when(mockConnection.getData()).thenReturn(mockInsightsList); // Mock 迭代器,支持直接遍历Connection对象 Mockito.when(mockConnection.iterator()).thenReturn(mockInsightsList.iterator()); // 若业务代码涉及分页逻辑,按需补充Mock分页方法 Mockito.when(mockConnection.hasNextPage()).thenReturn(false); Mockito.when(mockConnection.nextPage()).thenReturn(null);
3. Mock FacebookClient的fetchConnection方法
将Mock好的Connection对象作为fetchConnection的返回值:
import com.restfb.FacebookClient; FacebookClient mockFbClient = Mockito.mock(FacebookClient.class); // 根据实际调用参数调整匹配规则,示例为任意字符串、指定AdsInsights类、任意参数Map Mockito.when(mockFbClient.fetchConnection( Mockito.anyString(), Mockito.eq(AdsInsights.class), Mockito.anyMap() )).thenReturn(mockConnection);
关键说明
- 如果业务代码是通过
connection.getData()获取列表再遍历,仅MockgetData()即可;但如果是直接遍历Connection对象(如for (AdsInsights insight : connection)),必须Mockiterator()方法。 - 若业务逻辑需要处理分页,务必Mock
hasNextPage()和nextPage(),避免分页流程中出现空指针。
内容的提问来源于stack exchange,提问作者ujjawal
相关产品推荐
相关产品推荐

