You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:55:23