Java 用于读取csv文件的JUnit测试

Java 用于读取csv文件的JUnit测试,java,file,junit,junit4,Java,File,Junit,Junit4,我有一种方法,可以逐行读取csv文件,并将每条记录放入列表中。我想测试一下这个方法。我所做的是创建了一个预期记录的列表,然后创建了一个csv文件,其中包含我在列表中创建的相同记录。我阅读了这个新创建的csv文件,并将其放入实际记录列表中。然后我比较了两个列表,但它给出了一个断言错误 java.lang.AssertionError:应为:但为 这是我的密码 String[] record = new String[] { "source", "name", "component", "10",

我有一种方法,可以逐行读取csv文件,并将每条记录放入列表中。我想测试一下这个方法。我所做的是创建了一个预期记录的列表,然后创建了一个csv文件,其中包含我在列表中创建的相同记录。我阅读了这个新创建的csv文件,并将其放入实际记录列表中。然后我比较了两个列表,但它给出了一个断言错误

java.lang.AssertionError:应为:但为

这是我的密码

String[] record = new String[] { "source", "name", "component", "10", "100", "10.5", "200", "15.5" }; 

MyReader reader = new MyReader();

@Test
public void readDataTest () throws FileNotFoundException
{
    List< String[] > expectedrecords = new ArrayList< String[] >();
    expectedrecords.add( record );

    List< String[] > actualrecords = new ArrayList< String[] >();
    generatetestCSV( dirPath + "\\Messages_Statistics.csv" );
    actualrecords = reader.readData( dirPath + "\\Messages_Statistics.csv" );

    Assert.assertEquals( expectedrecords, actualrecords );
}

private void generatetestCSV ( String fileName )
{
    try
    {
        FileWriter writer = new FileWriter( fileName );
        writer.append( "source" );
        writer.append( ',' );
        writer.append( "name" );
        writer.append( ',' );
        writer.append( "component" );
        writer.append( ',' );
        writer.append( "10" );
        writer.append( ',' );
        writer.append( "100" );
        writer.append( ',' );
        writer.append( "10.5" );
        writer.append( ',' );
        writer.append( "200" );
        writer.append( ',' );
        writer.append( "15.5" );
        writer.append( '\n' );
        writer.flush();
        writer.close();
    }
    catch ( IOException e )
    {
        e.printStackTrace();
    }
}
String[]record=新字符串[]{“源”、“名称”、“组件”、“10”、“100”、“10.5”、“200”、“15.5”};
MyReader=新建MyReader();
@试验
public void readDataTest()引发FileNotFoundException
{
Listexpectedrecords=new ArrayList();
expectedrecords.add(记录);
Listactualrecords=newarraylist();
generatetestCSV(dirPath+“\\Messages\u Statistics.csv”);
actualrecords=reader.readData(dirPath+“\\Messages\u Statistics.csv”);
Assert.assertEquals(预期记录、实际记录);
}
私有void generatetestCSV(字符串文件名)
{
尝试
{
FileWriter writer=新的FileWriter(文件名);
writer.append(“来源”);
writer.append(',');
作者。附加(“姓名”);
writer.append(',');
附加(“组件”);
writer.append(',');
作者。附加(“10”);
writer.append(',');
作者。附加(“100”);
writer.append(',');
作者。附加(“10.5”);
writer.append(',');
作者。附加(“200”);
writer.append(',');
作者。附加(“15.5”);
writer.append('\n');
writer.flush();
writer.close();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
MyReader类中的readData为

  public List< String[] > readData ( String csvFile ) throws FileNotFoundException
{

    List< String[] > records = new ArrayList< String[] >();
    BufferedReader br = new BufferedReader( new FileReader( csvFile ) );
    String line = "";
    try
    {
        if ( csvFile != null )
        {
            if ( csvFile.contains( "Messages_Statistics" ) )
            {
                while ( ( line = br.readLine() ) != null )
                {
                    String[] record = line.split( "," );
                    if ( records.size() < LIMIT )
                        records.add( record );
                    else
                        break;
                }
            }

        }
    }
    catch ( FileNotFoundException e )
    {
        //logger.error( "Error in reading CSV file", e );
    }
    catch ( IOException e )
    {
        e.printStackTrace();
    }
    finally
    {
        if ( br != null )
        {
            try
            {
                br.close();
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
    return records;
}
public ListreadData(String csvFile)抛出FileNotFoundException
{
Listrecords=newarraylist();
BufferedReader br=新的BufferedReader(新文件读取器(csvFile));
字符串行=”;
尝试
{
if(csvFile!=null)
{
if(csvFile.contains(“Messages_Statistics”))
{
而((line=br.readLine())!=null)
{
字符串[]记录=行。拆分(“,”);
if(records.size()
这是比较不同的列表对象实例。您需要运行一个循环并对列表的各个条目进行断言

更改断言检查,如下所示

 Assert.assertEquals(expectedrecords.size(),actualrecords.size());
    int count = 0;

    for(String[] lineData: expectedrecords)
    {
        String[] actualRecordData = actualrecords.get(count);
        count++;

        Assert.assertEquals( lineData.length,actualRecordData.length);

        for(int i = 0; i < lineData.length; i++)
        {
            Assert.assertEquals( lineData[i],actualRecordData[i]);
        }
    }
Assert.assertEquals(expectedrecords.size(),actualrecords.size());
整数计数=0;
对于(字符串[]行数据:expectedrecords)
{
字符串[]actualRecordData=actualrecords.get(计数);
计数++;
Assert.assertEquals(lineData.length、actualRecordData.length);
对于(int i=0;i
编写一个函数,将列表格式化为字符串,然后比较字符串。如果他们匹配,你就很好。如果没有,那么字符串diff比谈论列表中的索引的异常更可读。尤其是在IntelliJ或Eclipse中运行测试时,它们会格式化字符串以使差异非常明显。

您不能使用
Assert.assertEquals
来比较
列表
。这不起作用:

List<String[]> expected = new ArrayList<>();
expected.add(new String[]{"foo", "bar"});
expected.add(new String[]{"baz", "qux"});

List<String[]> actual = new ArrayList<>();
actual.add(new String[]{"foo", "bar"});
actual.add(new String[]{"baz", "qux"});

Assert.assertEquals(expected, actual); // Fails!
List expected=new ArrayList();
应为.add(新字符串[]{“foo”,“bar”});
应为.add(新字符串[]{“baz”,“qux”});
列表实际值=新的ArrayList();
add(新字符串[]{“foo”,“bar”});
add(新字符串[]{“baz”,“qux”});
Assert.assertEquals(预期、实际);//失败!
你必须这样做:

List<String[]> expected = new ArrayList<>();
expected.add(new String[]{"foo", "bar"});
expected.add(new String[]{"baz", "qux"});

List<String[]> actual = new ArrayList<>();
actual.add(new String[]{"foo", "bar"});
actual.add(new String[]{"baz", "qux"});

assertEquals(expected.size(), actual.size());
for (int i = 0; i < expected.size(); i++) {
    for (int j = 0; j < expected.get(i).length; j++) {
        Assert.assertEquals(expected.get(i)[j], actual.get(i)[j]);
    }
}
List expected=new ArrayList();
应为.add(新字符串[]{“foo”,“bar”});
应为.add(新字符串[]{“baz”,“qux”});
列表实际值=新的ArrayList();
add(新字符串[]{“foo”,“bar”});
add(新字符串[]{“baz”,“qux”});
assertEquals(预期的.size(),实际的.size());
对于(int i=0;i
您不能使用
Assert.assertEquals
来比较
列表
。那么我应该使用什么呢?请您解释一下您的循环位外部循环位于
列表
(CSV的行)周围,内部循环位于
字符串[]
(行的单元格)周围。将
预期的
中的每个单元格与
实际的
中的相应单元格进行比较。为什么不将
assertArrayEquals
(如本文所述)与
toArray
结合使用呢。
List<String[]> expected = new ArrayList<>();
expected.add(new String[]{"foo", "bar"});
expected.add(new String[]{"baz", "qux"});

List<String[]> actual = new ArrayList<>();
actual.add(new String[]{"foo", "bar"});
actual.add(new String[]{"baz", "qux"});

assertEquals(expected.size(), actual.size());
for (int i = 0; i < expected.size(); i++) {
    for (int j = 0; j < expected.get(i).length; j++) {
        Assert.assertEquals(expected.get(i)[j], actual.get(i)[j]);
    }
}