Java csv阅读器的mockito和单元测试

Java csv阅读器的mockito和单元测试,java,unit-testing,csv,mocking,mockito,Java,Unit Testing,Csv,Mocking,Mockito,在csv阅读器的单元测试中模拟我们想要读取csv并将其放入POJO并进行一些查询,这有意义吗?(具体来说,我指的是模拟文件读取) 让我们假设以下示例: ICsvBeanReader beanReader = null; beanReader = new CsvBeanReader(new FileReader(csvFileName), CsvPreference.STANDARD_PREFERENCE); String[] header = beanR

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

提前感谢。

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

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

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

要创建单元测试,可以模拟文件读取器对象以返回虚拟响应(
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上执行断言,并验证代码的业务逻辑是否正确。

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

要创建单元测试,可以模拟文件读取器对象以返回虚拟响应(
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上执行断言,并验证代码的业务逻辑是否正确。

好主意,这有助于在单元测试中实现关注点分离。好主意,这有助于在单元测试中实现关注点分离。非常感谢。我有个问题。若文件读取器返回一个虚拟响应,那个么模拟的是什么?我在问题中添加了一个示例代码。非常好。谢谢,非常感谢。我有个问题。若文件读取器返回一个虚拟响应,那个么模拟的是什么?我在问题中添加了一个示例代码。非常好。谢谢