Java单元测试:如何从Field对象中获取ArrayList?
问题解决方法
问题出在Field.get()方法返回的是Object类型,编译器无法识别它实际是ArrayList,所以直接调用isEmpty()会报错。解决办法很简单:把获取到的对象强转为ArrayList类型,之后就能正常调用集合方法了。
修改后的单字段测试代码
dataSource.loadData(); final Field[] fields = new Field[4]; fields[0] = dataSource.getClass().getDeclaredField("images"); fields[1] = dataSource.getClass().getDeclaredField("categories"); fields[2] = dataSource.getClass().getDeclaredField("descriptions"); fields[3] = dataSource.getClass().getDeclaredField("categoryDescriptions"); // 批量设置字段可访问性 for (Field field : fields) { field.setAccessible(true); } // 强转后调用isEmpty()做断言 ArrayList<?> imagesList = (ArrayList<?>) fields[0].get(dataSource); assertTrue("Images is empty", !imagesList.isEmpty()); // 其他字段同理验证 ArrayList<?> categoriesList = (ArrayList<?>) fields[1].get(dataSource); assertTrue("Categories is empty", !categoriesList.isEmpty()); ArrayList<?> descriptionsList = (ArrayList<?>) fields[2].get(dataSource); assertTrue("Descriptions is empty", !descriptionsList.isEmpty()); ArrayList<?> categoryDescriptionsList = (ArrayList<?>) fields[3].get(dataSource); assertTrue("Category descriptions is empty", !categoryDescriptionsList.isEmpty());
更简洁的循环写法
如果四个字段都是ArrayList类型,可以用循环简化重复代码:
dataSource.loadData(); // 定义要测试的字段名数组 String[] fieldNames = {"images", "categories", "descriptions", "categoryDescriptions"}; Class<?> dataSourceClass = dataSource.getClass(); for (String fieldName : fieldNames) { Field field = dataSourceClass.getDeclaredField(fieldName); field.setAccessible(true); // 强转为ArrayList,用<?>适配任意元素类型 ArrayList<?> list = (ArrayList<?>) field.get(dataSource); assertTrue(String.format("%s list is empty", fieldName), !list.isEmpty()); }
补充说明
- 用
ArrayList<?>而不是具体泛型,是因为我们只需要判断集合是否为空,不需要操作内部元素,这样适配性更强。 - 如果你的ArrayList有明确的元素类型(比如
ArrayList<String>),也可以强转为对应类型,不影响功能。
内容的提问来源于stack exchange,提问作者Lebo
相关产品推荐
相关产品推荐

