【问题标题】:Testing writing into a csv file using JUnit [duplicate]使用 JUnit 测试写入 csv 文件 [重复]
【发布时间】:2014-06-30 09:38:43
【问题描述】:

我是 junit 测试的新手,我想编写单元测试。实际上这些方法不返回任何东西。它获取信号列表并将其写入 csv 文件。我不确定如何测试具有 void 返回类型的方法。

谁能帮帮我?

public void createCSV ( final ArrayList< Signal > messages, File file )
{
    try
    {
        // Use FileWriter constructor that specifies open for appending
        csvOutput = new MyWriter( new FileWriter( file, false ), ',' );

        // Create Header for CSV
        csvOutput.writeRecord( "Message Source" );
        csvOutput.writeRecord( "Message Name" );
        csvOutput.writeRecord( "Component" );
        csvOutput.writeRecord( "Occurance" );
        csvOutput.writeRecord( "Message Payload with Header" );
        csvOutput.writeRecord( "Bandwidth(with Header %)" );
        csvOutput.writeRecord( "Message Payload" );
        csvOutput.writeRecord( "Bandwidth(%)" );
        csvOutput.endOfRecord();

        for ( Signal signal : messages )
        {
            csvOutput.writeRecord( signal.getSource() );
            csvOutput.writeRecord( signal.getName() );
            csvOutput.writeRecord( signal.getComponent() );
            csvOutput.writeRecord( Integer.toString( signal.getOccurance() ) );
            csvOutput.writeRecord( Integer.toString( signal
                .getSizewithHeader() ) );
            csvOutput.writeRecord( Float.toString( signal
                .getBandwidthWithHeader() ) );
            csvOutput.writeRecord( Integer.toString( signal.getSize() ) );
            csvOutput.writeRecord( Float.toString( signal.getBandwidth() ) );
            csvOutput.endOfRecord();
        }
    }
    catch ( IOException e )
    {
        logger.error( "Error in writing CSV file for messages", e );
    }
    finally
    {
        try
        {
            if ( csvOutput != null )
            {
                csvOutput.flush();
                csvOutput.close();
            }
            messages.clear();
        }
        catch ( IOException ex )
        {
            ex.printStackTrace();
        }
    }
 }
}

【问题讨论】:

标签: java junit junit4 easymock


【解决方案1】:

一个人拿一张地图并对其进行排序。

传入具有已知未排序值的映射。调用该方法后验证地图是否已排序。

另一个获取排序后的地图并将其写入 csv 文件。我不确定如何测试具有 void 返回类型的方法。

两种选择:

  1. 传入一个临时文件路径,例如查看JUnit temporary folders,然后在调用该方法后读取该文件并测试其正确性。

  2. 调整您的方法以接受 OutputStream 而不是 File。然后您可以传递一个ByteArrayOutputStream 并通过调用toByteArray() 并检查字节来验证其内容。

【讨论】:

  • 好的,我创建了一个未排序值的地图,我调用了传递该地图的方法,我如何验证地图现在已排序,因为该方法不返回已排序的地图
  • @UmairIqbal 要么手工制作排序地图并比较两者,要么使用您信任的现有排序方法(例如来自 JDK)对地图进行排序和比较。
  • 我的问题是我有两张内容完全相同的地图,一张已排序,另一张未排序我将未排序的地图传递给对地图进行排序的方法。我怎样才能比较它们?我需要任何断言语句吗?怎么样?
  • @UmairIqbal 你的地图是什么类型的 - TreeMap
  • 不,很简单 Hashmap private HashMap _SignalsMap = new HashMap();
【解决方案2】:

文件单元测试

如果不想修改src代码:

在单元测试中,我会将文件传递给临时路径,调用该创建 csv 方法并 然后打开文件并根据您要投入多少精力:

检查
1) 如果文件存在(使用生成的包含当前时间的文件名)
2) 检查长度是否大于0字节
3)阅读第一行和最后一行并检查预期内容

但在大多数情况下,OutputStreamFile 参数更灵活。
在生产代码中传递FileOutputStream,在单元测试中传递ByteArrayOutputStream,您可以使用ByteArrayInputStream 对其进行解析。

这是更清洁的解决方案,因为它不会创建应清理的文件,而且运行速度更快。

用于排序的单元测试 只需创建一个未排序的地图。调用你排序,并检查要排序的结果: 迭代并检查每个下一个元素是否例如大于前一个元素(或更小取决于排序顺序)

只是

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2016-11-16
    • 2012-12-17
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多