1

Есть CSV файл в качестве стандарта ресурсов Maven проекта Dir следующим образом:Как читать CSV файл из директории ресурсов в JUnit Test с помощью FileUtils

src/main/resources/fruits.csv 
src/test/resources/fruits.csv 

fruits.csv

Type, Quantity 
apple, 50 
banana, 60 
orange, 70 

Используя следующие библиотеки

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-csv</artifactId> 
    <version>1.0</version> 
</dependency> 

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 

Фруктовые (стандарт POJO)

public class Fruit { 

    private String type 
    private int quantity; 

    public Fruit(String type, int quantity) { 
     this.type = type; 
     this.quantity = quantity; 
    } 

    // Getters & Setters 
} 

CsvFileReader

public class CsvFileReader { 

    private static final String [] FILE_HEADER = {""}; 

    private static final String TYPE = "Type"; 
    private static final String QUANTITY + "Quantity"; 

    public static List<Candidate> readCsvFile(File fileName) { 
     FileReader fileReader = null; 
     CSVParser csvFileParser = null; 

     CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER); 
     List<Candidate> fruits = null; 
     try { 
      fruits = new ArrayList<>(); 
      String file = FileUtils.readFileToString(fileName); 
      fileReader = new FileReader(file); 
      csvFileParser = new CSVParser(fileReader, csvFormat); 
      List<CSVRecord> records = csvFileParser.getRecords(); 

      for (int i = 1; i < records.size(); i++) { 
       CSVRecord record = records.get(i); 
       Fruit fruit = new Fruit(record.get(TYPE), Integer.parseInt(QUANTITY)); 
       fruits.add(fruit); 
      } 
     } 
     catch(Throwable t) { 
      t.printStackTrace(); 
     } 
     finally { 
      try { 
       fileReader.close(); 
       csvFileParser.close(); 
      } catch(IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return fruits; 
    } 
} 

CsvFileReaderTest (JUnit 4 Пример теста):

public class CsvFileReaderTest { 

    File csvFile = null; 

    @Before 
    public void setUp() throws Exception { 
     String userDir = System.getProperty("user.dir"); 
     String filePath = userDir + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator; 
     csvFile = FileUtils.getFile(filePath + "fruits.csv"); 
    } 
} 

Когда я бегу JUnit Test Case внутри Eclipse:

java.io.FileNotFoundException: Type, Quantity 
apple, 50 
banana, 60 
orange, 70 
(File name too long) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:146) 
    at java.io.FileInputStream.<init>(FileInputStream.java:101) 
    at java.io.FileReader.<init>(FileReader.java:58) 

Это, кажется, чтение файл, но проблема в том, что FileName слишком длинное?

Что я делаю неправильно?

+1

Весь смысл хранить файлы в SRC/главная/Ресурсы (или src/test/resources) должны иметь доступный файл в качестве ресурса в пути к классам выполнения (соответственно test), а также для загрузки его с помощью ClassLoader. Используйте 'SomeClass.class.getResourceAsStream ("/fruits.csv ")', чтобы получить InputStream над ресурсом. Не используйте файл IO. –

+0

Я предполагаю, что POJO - это просто пример, верно? Поскольку у конструктора отсутствует тип для второго аргумента – Vogel612

+0

Vogel612 - спасибо, что указали, что вне - я сделал соответствующие изменения. @JB Nizet, заявляете ли вы, что я должен запускать тест JUnit через maven вместо запуска через Eclipse? –

ответ

0

FileReader конструктор ожидает путь к файлу, в котором вы передаете содержание файла. Вы можете напрямую использовать конструктор CSVParser, который принимает CSV String.

csvFileParser = new CSVParser(file /*This is already file content*/, csvFormat); 

** Редактировать **

Еще лучше было бы, чтобы получить читателя к ресурсу и передать его в конструктор CSVParser:

reader = new BufferedReader(new InputStreamReader(
         this.getClass().getResourceAsStream("fruits.csv"))); 
csvFileParser = new CSVParser(reader, csvFormat);