package ru.stqa.trainings.testng.tricky3.sample33; import au.com.bytecode.opencsv.CSVReader; import org.testng.annotations.DataProvider; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; public class CsvDataProviders { @DataProvider public static Object[][] csvDataProvider(Method m) throws IOException { if (m.isAnnotationPresent(CsvDataSource.class)) { int length = m.getParameterTypes().length; CsvDataSource dataSource = m.getAnnotation(CsvDataSource.class); File csvFile = new File(dataSource.value()); List<Object[]> result = new ArrayList<Object[]>(); CSVReader reader = new CSVReader(new FileReader(csvFile)); String[] nextLine; while ((nextLine = reader.readNext()) != null) { System.out.println(Arrays.toString(nextLine)); Object[] parameters = new Object[length]; for (int i = 0; i < length; i++) { if (i < nextLine.length) { parameters[i] = nextLine[i]; } else { parameters[i] = null; } } result.add(parameters); } return result.toArray(new Object[result.size()][]); } else { throw new Error("There is no @CsvDataSource annotation on method " + m); } } @DataProvider public static Iterator<Object[]> lazyCsvDataProvider(Method m) throws IOException { if (m.isAnnotationPresent(CsvDataSource.class)) { int length = m.getParameterTypes().length; CsvDataSource dataSource = m.getAnnotation(CsvDataSource.class); File csvFile = new File(dataSource.value()); return new CsvFileIterator(csvFile, length); } else { throw new Error("There is no @CsvDataSource annotation on method " + m); } } private static class CsvFileIterator implements Iterator<Object[]> { private final CSVReader reader; private int length; private String[] nextLine; public CsvFileIterator(File csvFile, int length) throws FileNotFoundException { this.length = length; reader = new CSVReader(new FileReader(csvFile)); } @Override public boolean hasNext() { try { nextLine = reader.readNext(); return nextLine != null; } catch (IOException e) { return false; } } @Override public Object[] next() { if (nextLine == null) { return null; } System.out.println(Arrays.toString(nextLine)); Object[] parameters = new Object[length]; for (int i = 0; i < length; i++) { if (i < nextLine.length) { parameters[i] = nextLine[i]; } else { parameters[i] = null; } } return parameters; } @Override public void remove() { throw new UnsupportedOperationException(); } } }