csv阅读器的mockito和单元测试

时间:2016-04-04 15:11:25

标签: java unit-testing csv mocking mockito

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

我们假设以下示例:

 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);
    }

提前谢谢。

2 个答案:

答案 0 :(得分:2)

这似乎是一个好主意 - 它可以将您测试的单元与read()的实现分离。这样,如果你换到另一个库来阅读文件,你的单元测试都不必重写。

答案 1 :(得分: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上执行断言,并验证代码的业务逻辑是否正确。