自动化测试读取CSV文件报错:Attempt to read from null array
问题分析与解决
你遇到的Attempt to read from null array错误,核心原因是**csvCell变量为null时,你尝试访问它的索引[0]**,具体问题出在这几个地方:
- 你的
TestData类中,csvCell是类成员变量,在readFile方法的循环结束后,csvCell = csvReader.readNext()会被赋值为null(因为读完所有行后readNext()返回null),后续访问csvCell[0]自然报错。 readFile方法只是循环读取了CSV内容,但没有保存任何有效数据,最后返回null,等于白执行了读取操作。- 若你没有正确调用
readFile方法初始化csvCell,它会保持初始的null状态,访问索引同样触发错误。
修复方案
1. 先定义数据模型类(存储单条测试数据)
创建一个类来封装CSV里的单条用户数据,方便后续调用:
public class UserData { private String phone; private String idnp; private String cardNumber; public UserData(String phone, String idnp, String cardNumber) { this.phone = phone; this.idnp = idnp; this.cardNumber = cardNumber; } // 提供getter方法获取数据 public String getPhone() { return phone; } public String getIdnp() { return idnp; } public String getCardNumber() { return cardNumber; } }
2. 修改TestData类,正确读取并保存CSV数据
把CSV数据保存到集合中,避免使用类成员变量存储临时读取的数组:
import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import au.com.bytecode.opencsv.CSVReader; public class TestData { private static final String DATA_CSV_PATH = "src/androidTest/java/md/app/TestData/Data.csv"; private List<UserData> userDataList; // 加载CSV数据到集合 public void loadData() throws IOException, CsvValidationException { userDataList = new ArrayList<>(); // 使用try-with-resources自动关闭流,避免资源泄漏 try (CSVReader csvReader = new CSVReader(new FileReader(DATA_CSV_PATH))) { // 跳过CSV表头行(你的第一行是列名,不是测试数据) csvReader.readNext(); String[] csvCell; while ((csvCell = csvReader.readNext()) != null) { // 移除数据中的双引号,避免输入到控件中带引号 String phone = csvCell[0].replace("\"", ""); String idnp = csvCell[1].replace("\"", ""); String cardNumber = csvCell[2].replace("\"", ""); userDataList.add(new UserData(phone, idnp, cardNumber)); } } } // 根据索引获取指定的测试数据 public UserData getUserData(int index) { if (userDataList == null || index < 0 || index >= userDataList.size()) { throw new IllegalArgumentException("数据未加载或索引无效"); } return userDataList.get(index); } }
3. 在自动化测试中调用修改后的代码
// 初始化并加载测试数据 TestData testData = new TestData(); try { testData.loadData(); } catch (IOException | CsvValidationException e) { e.printStackTrace(); // 处理数据加载失败的情况,比如终止测试 } // 获取第一行测试数据 UserData userData = testData.getUserData(0); // 输入手机号到控件 onView(withId(R.id.et_phone_number)).perform(typeText(userData.getPhone()));
内容的提问来源于stack exchange,提问作者Catea
相关产品推荐
相关产品推荐

