#cucumber #bdd #cucumber-java
Вопрос:
Привет, я занимаюсь проектом BDD Cucumber. Вместо того, чтобы предоставлять данные в самом DataTable в файле функций cucumber. Я пытаюсь передать местоположение файла Excel, мой файл функций Cucumber выглядит примерно так
Feature: Read data from cucumber Feature
Scenario: Any scenario with different set of excel data
Then Read the data from excel sheet "C:UsersGovindDesktopMOCK_DATA.xlsx"
Теперь то, что я хочу сделать, это в моем определении шагов, я хочу использовать какой-то читатель Excel для чтения данных файла excel и преобразования этих данных в данные, доступные для обработки. Чтобы я мог использовать для этого DataTable.asMaps. Я уже реализовал это, но у меня возникли проблемы с использованием функции .asMaps для этой таблицы данных.
Мой класс ExcelReader-это
package otherutil;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelReaders {
private String fileName;
private String sheetName;
private int sheetIndex;
private XSSFWorkbook book;
private ExcelReaders(ExcelReaderBuilder excelReaderBuilder) {
this.fileName = excelReaderBuilder.fileName;
this.sheetIndex = excelReaderBuilder.sheetIndex;
this.sheetName = excelReaderBuilder.sheetName;
}
public static class ExcelReaderBuilder {
private String fileName;
private String sheetName;
private int sheetIndex;
public ExcelReaderBuilder setFileLocation(String location) {
this.fileName = location;
return this;
}
public ExcelReaderBuilder setSheet(String sheetName) {
this.sheetName = sheetName;
return this;
}
public ExcelReaderBuilder setSheet(int index) {
this.sheetIndex = index;
return this;
}
public ExcelReaders build() {
return new ExcelReaders(this);
}
}
private XSSFWorkbook getWorkBook(String filePath) throws InvalidFormatException, IOException {
return new XSSFWorkbook(new File(filePath));
}
private XSSFSheet getWorkBookSheet(String fileName, String sheetName) throws InvalidFormatException, IOException {
this.book = getWorkBook(fileName);
return this.book.getSheet(sheetName);
}
private XSSFSheet getWorkBookSheet(String fileName, int sheetIndex) throws InvalidFormatException, IOException {
this.book = getWorkBook(fileName);
return this.book.getSheetAt(sheetIndex);
}
public List<List<String>> getSheetData() throws IOException{
XSSFSheet sheet;
List<List<String>> outerList = new LinkedList<>();
try {
sheet = getWorkBookSheet(fileName, sheetName);
outerList = getSheetData(sheet);
} catch (InvalidFormatException e) {
throw new RuntimeException(e.getMessage());
}finally {
this.book.close();
}
return outerList;
}
public List<List<String>> getSheetDataAt() throws InvalidFormatException, IOException {
XSSFSheet sheet;
List<List<String>> outerList = new LinkedList<>();
try {
sheet = getWorkBookSheet(fileName, sheetIndex);
outerList = getSheetData(sheet);
} catch (InvalidFormatException e) {
throw new RuntimeException(e.getMessage());
}finally {
this.book.close();
}
return outerList;
}
private List<List<String>> getSheetData(XSSFSheet sheet) {
List<List<String>> outerList = new LinkedList<>();
prepareOutterList(sheet, outerList);
return Collections.unmodifiableList(outerList);
}
private void prepareOutterList(XSSFSheet sheet, List<List<String>> outerList) {
for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i ) {
List<String> innerList = new LinkedList<>();
XSSFRow xssfRow = sheet.getRow(i);
for (int j = xssfRow.getFirstCellNum(); j < xssfRow.getLastCellNum(); j ) {
prepareInnerList(innerList, xssfRow, j);
}
outerList.add(Collections.unmodifiableList(innerList));
}
}
private void prepareInnerList(List<String> innerList, XSSFRow xssfRow, int j) {
switch (xssfRow.getCell(j).getCellType()) {
case BLANK:
innerList.add("");
break;
case STRING:
innerList.add(xssfRow.getCell(j).getStringCellValue());
break;
case NUMERIC:
innerList.add(xssfRow.getCell(j).getNumericCellValue() "");
break;
case BOOLEAN:
innerList.add(xssfRow.getCell(j).getBooleanCellValue() "");
break;
default:
throw new IllegalArgumentException("Cannot read the column : " j);
}
}
}
и это мой код класса stepDefn
ExcelReaders readers = new ExcelReaders.ExcelReaderBuilder().setFileLocation(excelUrl).setSheet(0).build();
List<List<String>> excelData=readers.getSheetDataAt();
DataTable data = DataTable.create(excelData);
после этого я хочу использовать что-то подобное, чтобы я мог получить данные
for (Map<String, String> users : data.asMaps(String.class, String.class))) {
System.out.println(users.get("email"));
}
И мои данные в файле Excel выглядят так
Но я не бейл, чтобы это делать. Я повсюду нахожу помощь, но не могу ее получить. Любая помощь будет оценена по достоинству. Спасибо
Ответ №1:
Вы должны реализовать Transformer<T>
интерфейс cucumber и сопоставить List<List<String>>
его с DataTable
. Это работает на меня. Такие как:
import io.cucumber.cucumberexpression.Transformer
public class ExcelDataToDataTable extends Transformer<DataTable> {
@Override
public DataTable transform(String filePath) {
ExcelReader reader = new ExcelReader.ExcelReaderBuilder()
.setFileLocation(filePath)
.setSheet(0)
.build();
List<List<String>> excelData = getExcelData(reader);
List<DataTableRow> dataTableRows = getDataTableRows(excelData);
DataTable table = getDataTable(dataTableRows);
return table;
}