TestNG报错:无法为@Test注解方法注入String类型参数
问题描述
我用两个类获取目录下最新生成的Excel文件路径,在主方法调用这些路径时触发报错:Cannot inject @Test annotated Method [useFilepath] with [class java.lang.String]。主方法的作用是对比两个最新Excel文件并输出差异,相关代码如下:
第一个获取最新文件路径的类(DataBase_directory)
package API_Automation.panaray; import java.io.File; import java.util.Arrays; import java.util.Comparator; import org.testng.annotations.Test; public class DataBase_directory { public static String getLatestFilePath() { File folder = new File(".//Output_Files//Data_Base"); File[] listOfFiles = folder.listFiles(); File latestDir = null; for (File file : listOfFiles) { if (file.isDirectory() && (latestDir == null || file.lastModified() > latestDir.lastModified())) { latestDir = file; } } if (latestDir != null) { File directory = new File(latestDir.getPath()); File[] files = directory.listFiles(); Arrays.sort(files, new Comparator<File>() { public int compare(File f1, File f2) { return Long.valueOf(f2.lastModified()).compareTo(f1.lastModified()); } }); for (File file : files) { if (file.isFile() && file.getName().endsWith(".xlsx")) { return file.getPath(); } } } return null; } }
第二个获取最新文件路径的类(Elastic_Search_directory)
package API_Automation.panaray; import java.io.File; import java.util.Arrays; import java.util.Comparator; import org.testng.annotations.Test; public class Elastic_Search_directory { public static String getLatestFilePath() { File folder = new File(".//Output_Files//Elastic_Search"); File[] listOfFiles = folder.listFiles(); File latestDir = null; for (File file : listOfFiles) { if (file.isDirectory() && (latestDir == null || file.lastModified() > latestDir.lastModified())) { latestDir = file; } } if (latestDir != null) { File directory = new File(latestDir.getPath()); File[] files = directory.listFiles(); Arrays.sort(files, new Comparator<File>() { public int compare(File f1, File f2) { return Long.valueOf(f2.lastModified()).compareTo(f1.lastModified()); } }); for (File file : files) { if (file.isFile() && file.getName().endsWith(".xlsx")) { return file.getPath(); } } } return null; } }
主对比类(Excel_Compare)
package API_Automation.panaray; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.testng.annotations.Test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; public class Excel_Compare { public void useFilepath(String filepath) throws IOException { if (filepath == null) { System.out.println("no file"); } else { System.out.println("The filepath is" + filepath); } } @Test public void main(String[] args) throws IOException { DataBase_directory DB_directory = new DataBase_directory(); String filepath1 = DB_directory.getLatestFilePath(); System.out.println(filepath1); DataBase_directory ES_directory = new DataBase_directory(); String filepath2 = ES_directory.getLatestFilePath(); System.out.println(filepath2); LocalDateTime date = LocalDateTime.now(); DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); String formattedDate = date.format(dateFormat); DateTimeFormatter dateformat = DateTimeFormatter.ofPattern("dd-MM-yyyy HH-mm"); String formatedate = date.format(dateformat); Path dir = Paths.get(".//Difference_Excel_Files//Excelfiles-" + formattedDate); Files.createDirectories(dir); try { FileInputStream file1 = new FileInputStream(new File(filepath1)); FileInputStream file2 = new FileInputStream(new File(filepath2)); Workbook workbook1 = WorkbookFactory.create(file1); Workbook workbook2 = WorkbookFactory.create(file2); List<String[]> differences = new ArrayList<>(); for (int i = 0; i < workbook1.getNumberOfSheets(); i++) { Sheet sheet1 = workbook1.getSheetAt(i); Sheet sheet2 = workbook2.getSheetAt(i); for (int j = 1; j < sheet1.getLastRowNum(); j++) { Row row1 = sheet1.getRow(j); Row row2 = sheet2.getRow(j); for (int k = 1; k < row1.getLastCellNum(); k++) { Cell cell1 = row1.getCell(k); Cell cell2 = row2.getCell(k); Cell cell3 = sheet1.getRow(0).getCell(k); Cell cell4 = sheet1.getRow(j).getCell(0); int type1 = cell1.getCellType(); int type2 = cell2.getCellType(); if (type1 == XSSFCell.CELL_TYPE_STRING & type2 == XSSFCell.CELL_TYPE_STRING) { if (!cell1.getStringCellValue().equals(cell2.getStringCellValue())) { differences.add(new String[] { sheet1.getSheetName(), cell4.getStringCellValue(), cell1.getStringCellValue(), cell2.getStringCellValue(), cell3.getStringCellValue() }); } } else if (type1 == XSSFCell.CELL_TYPE_NUMERIC && type2 == XSSFCell.CELL_TYPE_NUMERIC) { if (cell1.getNumericCellValue() != (cell2.getNumericCellValue())) { differences.add(new String[] { sheet1.getSheetName(), cell4.getStringCellValue(), cell1.getStringCellValue(), cell2.getStringCellValue(), cell3.getStringCellValue() }); } } } } } if (differences.contains(differences)) { System.out.println("Data is not matching"); } else { System.out.println("Data is matching"); } FileOutputStream fileOut = new FileOutputStream(dir + "//Difference" + "-" + formatedate + ".xlsx"); Workbook differencesWorkbook = new XSSFWorkbook(); Sheet differencesSheet = differencesWorkbook.createSheet("Differences"); if (differences.contains(differences)) { for (int i = 0; i < differences.size(); i++) { Row row = differencesSheet.createRow(i); for (int j = 0; j < differences.get(i).length; j++) { Cell cell = row.createCell(j); cell.setCellValue(differences.get(i)[j]); } } differencesWorkbook.write(fileOut); fileOut.close(); } else { differencesSheet.createRow(0).createCell(0).setCellValue("Data is matching"); differencesWorkbook.write(fileOut); fileOut.close(); } } catch (Exception e) { e.printStackTrace(); } } }
问题原因与修复方案
1. 报错核心原因
TestNG的@Test注解方法不能携带未通过DataProvider注入的参数。你的main方法加了@Test注解,但同时声明了String[] args参数,TestNG无法自动注入该参数,这就是报错的直接原因。
2. 具体修复步骤
(1)修正测试方法签名
去掉main方法的args参数,或者将其改为无参的测试方法,同时修正方法名(TestNG测试方法不需要叫main):
@Test public void compareExcelFiles() throws IOException { // 原main方法的逻辑全部移到这里,去掉String[] args参数 DataBase_directory DB_directory = new DataBase_directory(); String filepath1 = DB_directory.getLatestFilePath(); System.out.println(filepath1); // 修正:这里应该实例化Elastic_Search_directory,不是DataBase_directory Elastic_Search_directory ES_directory = new Elastic_Search_directory(); String filepath2 = ES_directory.getLatestFilePath(); System.out.println(filepath2); // 后续逻辑保持不变 }
(2)修复文件路径获取错误
原代码中获取第二个文件路径时,错误地使用了DataBase_directory,导致两次获取同一个目录的文件,改为Elastic_Search_directory才能实现不同目录文件的对比。
(3)修正差异判断逻辑
原代码中differences.contains(differences)是无效判断,改为!differences.isEmpty()来检测是否存在差异:
if (!differences.isEmpty()) { System.out.println("Data is not matching"); } else { System.out.println("Data is matching"); }
3. 额外优化建议
两个获取文件路径的类逻辑完全重复,可以抽象成工具类减少冗余:
public class FileUtil { public static String getLatestFilePath(String directoryPath) { File folder = new File(directoryPath); File[] listOfFiles = folder.listFiles(); File latestDir = null; for (File file : listOfFiles) { if (file.isDirectory() && (latestDir == null || file.lastModified() > latestDir.lastModified())) { latestDir = file; } } if (latestDir != null) { File directory = new File(latestDir.getPath()); File[] files = directory.listFiles(); Arrays.sort(files, (f1, f2) -> Long.valueOf(f2.lastModified()).compareTo(f1.lastModified())); for (File file : files) { if (file.isFile() && file.getName().endsWith(".xlsx")) { return file.getPath(); } } } return null; } }
调用时直接传入目录路径即可:
String filepath1 = FileUtil.getLatestFilePath(".//Output_Files//Data_Base"); String filepath2 = FileUtil.getLatestFilePath(".//Output_Files//Elastic_Search");
内容的提问来源于stack exchange,提问作者ramesh
相关产品推荐
相关产品推荐

