求助:如何为BigQueryServiceImpl编写JUnit Mockito测试用例
解决方法:创建GeoDataDetails接口实例列表
在JUnit Mockito测试中,要构建GeoDataRepository.GeoDataDetails嵌套接口的对象列表,有两种实用方式,具体实现如下:
方法1:用Mockito模拟接口实例
Mockito可直接生成接口的模拟对象,无需手动实现所有方法,适合快速搭建测试数据:
@Test public void testPostDatatoBigquery() throws Exception { // 模拟单个GeoDataDetails实例 GeoDataRepository.GeoDataDetails mockGeoData = Mockito.mock(GeoDataRepository.GeoDataDetails.class); // 根据测试需求设置接口方法返回值 Mockito.when(mockGeoData.getOfisFarmerId()).thenReturn(100L); Mockito.when(mockGeoData.getPlotId()).thenReturn(1001L); Mockito.when(mockGeoData.getJobId()).thenReturn(1); Mockito.when(mockGeoData.getGeoUnitType()).thenReturn("POLYGON"); // 按需设置其他方法的返回值 // 构建实例列表 List<GeoDataRepository.GeoDataDetails> geoDataList = Collections.singletonList(mockGeoData); // 桩定Repository方法(注意匹配原方法的loadLimit参数) Mockito.when(geoDataRepository.getGeoDataForBigQuery(Mockito.anyLong())).thenReturn(geoDataList); // 执行测试逻辑 MessageDTO messageDTO = bigQueryServiceImpl.postDatatoBigquery(); assertNotNull(messageDTO); }
方法2:用匿名内部类实现接口
如果不想依赖Mockito,可通过匿名内部类手动实现接口的所有方法:
@Test public void testPostDatatoBigquery() throws Exception { // 创建单个GeoDataDetails实例 GeoDataRepository.GeoDataDetails geoData = new GeoDataRepository.GeoDataDetails() { @Override public Long getOfisFarmerId() { return 100L; } @Override public Integer getGeodbId() { return 200; } @Override public String getDataSource() { return "TEST_SOURCE"; } @Override public String getCountryName() { return "India"; } @Override public String getFarmerGroupName() { return "Group A"; } @Override public String getGeo() { return "TEST_GEO"; } @Override public String getGeoUnitType() { return "POLYGON"; } @Override public Integer getJobId() { return 1; } @Override public Long getPlotId() { return 1001L; } @Override public String getRegionName() { return "Region X"; } @Override public String getProductName() { return "Rice"; } @Override public Integer getYear() { return 2024; } @Override public Boolean getisActive() { return true; } }; // 构建实例列表 List<GeoDataRepository.GeoDataDetails> geoDataList = Arrays.asList(geoData); // 桩定Repository方法 Mockito.when(geoDataRepository.getGeoDataForBigQuery(Mockito.anyLong())).thenReturn(geoDataList); // 执行测试逻辑 MessageDTO messageDTO = bigQueryServiceImpl.postDatatoBigquery(); assertNotNull(messageDTO); }
额外注意事项
- 原方法
getGeoDataForBigQuery带有loadLimit参数,桩定时需匹配参数:可使用Mockito.anyLong()匹配任意Long值,或指定与注入的loadLimit一致的具体测试值。 - 如需多个不同实例,重复创建模拟对象或匿名内部类实例并添加到列表即可。
- 对于
GeoDataPinDetails接口,可采用同样方式创建实例进行桩定。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

