【问题标题】:mockito and unit test for a csv readercsv阅读器的模拟和单元测试
【发布时间】:2016-04-04 15:11:25
【问题描述】:

在我们想要读取 csv 并将它们放入 POJO 并进行一些查询的 csv 阅读器的单元测试中进行模拟是否有意义? (特别是我的意思是模拟文件读取)。

让我们假设以下示例:

 ICsvBeanReader beanReader = null;
    beanReader = new CsvBeanReader(new FileReader(csvFileName),
            CsvPreference.STANDARD_PREFERENCE);
    String[] header = beanReader.getHeader(true);
    Book bookBean = null;
    while ((bookBean = beanReader.read(Book.class, header,
         processors))!= null) {
     books.add(bookBean);
    }

提前谢谢你。

【问题讨论】:

    标签: java unit-testing csv mocking mockito


    【解决方案1】:

    这似乎是个好主意 - 它可以将您正在测试的单元与您的 read() 实现分离。这样,如果您更改为不同的库来读取文件,您的单元测试就不必全部重写。

    【讨论】:

    • 好主意,这有助于在单元测试中实现关注点分离。
    【解决方案2】:

    严格来说,单元测试旨在测试一段代码的功能,而不是代码与程序外部部分的集成。测试读取实际文件的功能将是 集成 测试,而不是单元测试。集成测试也很重要,因为您要确保文件阅读器可以在实际文件上运行。但是为了保证代码运行,也可以创建单元测试。

    要创建单元测试,您可以模拟文件读取器对象以返回虚拟响应(byte[] 或接口提供的任何类型)。然后您可以填充您的 POJO 并断言一切都按预期运行。

    总而言之,集成测试和单元测试都可能是个好主意,但是单元测试可以让您隔离和测试代码的逻辑。

    更新:

    考虑到您更新的代码示例,我会像这样模拟CsvBeanReader

    ICsvBeanReader mockedBeanReader = mock(CsvBeanReader.class);
    Book book1 = new Book();
    Book book2 = new Book();
    Book book3 = new Book();
    when(mockedBeanReader.getHeader(true))
        .thenReturn(new String[]{"here", "is", "header"});
    when(mockedBeanReader.read(Book.class, header, processors))
        .thenReturn(book1)
        .thenReturn(book2)
        .thenReturn(book3);
    

    现在你有了一个完全模拟的CsvBeanReader 对象。您可以对 POJO 执行断言并验证代码的业务逻辑是否正确。

    【讨论】:

    • 非常感谢。我有个问题。如果文件阅读器返回一个虚拟响应,那么在模拟什么?我在问题中添加了示例代码。
    • 非常好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多