Создание универсального метода для загрузки набора данных в cucumber с использованием библиотеки Poiji

#java #selenium #cucumber #gherkin

#java #селен #cucumber #корнишон

Вопрос:

У меня есть класс который загружает данные из шагов сценария мой первый класс LoadUserStepDfn

 public class LoadUserStepDfn extends LoadDataStepDfn<User> {

public LoadUserStepDfn(ReadingUserUsingPoiji readingUserUsingPoiji) {
    super.readingExcelUsingPoiji = readingUserUsingPoiji;
}

@Given("^Data is loaded from "([^"]*)"$")
public void data_is_loaded_from (String filePath) throws Throwable {
    super.data_is_loaded_from(filePath);
}
 

и он вызывает класс с именем LoadDataStepDfn

 public class LoadDataStepDfn<T> {

public List<T> data;

protected ReadingExcelUsingPoiji readingExcelUsingPoiji;

public void data_is_loaded_from (String filePath) throws Throwable {
    data = readingExcelUsingPoiji.TransformExcelToClass(filePath);

}
 

а вот мой класс, который читает excel и сохраняет его в классе Java

 public abstract class ReadingExcelUsingPoiji<T> {


public List<T> TransformExcelToClass(String filePath){
    PoijiOptions options = PoijiOptions.PoijiOptionsBuilder.settings().addListDelimiter(";").build();
    List<T> data = Poiji.fromExcel(new File(filePath), getMyType(), options);
    return data;
}

public abstract Class<T> getMyType();
 

}

проблема в том, что я хочу использовать один класс, я не хочу, чтобы он был абстрактным, и использовать другой, который является этим классом

 public class ReadingUserUsingPoiji extends ReadingExcelUsingPoiji<User> {


public Class<User> getMyType(){
    return User.class;
}
 

Комментарии:

1. Любой класс в Java может быть расширен (без его абстрактного / или окончательного)

2. здравствуйте, спасибо, что ответили здесь причина, по которой я использую класс secend, заключается в том, что я хочу узнать тип объекта с помощью ** getMyType ** есть ли способ сделать это в том же классе

3. Да, ваш первый общедоступный класс ReadingExcelUsingPoiji будет иметь метод, который реализован и возвращает его тип, затем класс, который расширяет, будет выполнять extends ReadingExcelUsingPoiji затем @Переопределить этот родительский метод. Таким образом, ваш ReadingExcelUsingPoiji вернет ReadingExcelUsingPoji.class , и ваш ReadingUserUsingPoiji вернет ReadingUserUsingPoiji .class из своего метода … или что вы хотите

4. Идея @override будет работать независимо от того, является ли ваш родительский класс абстрактным или нет…

5. ах, я использую ReadingExcelUsingPoiji для преобразования файла Excel в Class Object для этого я использую ReadingExcelUsingPoiji для выполнения преобразования, но мне нужно передать тип объекта класса для моего класса User class поэтому я создаю другой класс с именем ReadingUserUsingPoiji, чтобы получить тип пользователя, я хочу сохранить только ReadingExcelUsingPoijiи используйте его с любым универсальным методом объекта класса

Ответ №1:

Я пытаюсь понять здесь, поэтому вам нужен не @override, а метод 1, который возвращает вам тип класса для преобразования??

Почему это не может быть так просто… У вас есть метод, который определяет, в какой класс вы должны использовать для преобразования…

Я не понимаю, почему вы используете дженерики…ваша логика, похоже, действительно не заботится об этом? Особенно, если у вас есть 1 ReadingExcelUsingPoiji class..it на самом деле это не должно волновать.

 public class ReadingExcelUsingPoiji<T> {

public List<T> transformExcelToClass(String filePath, Class<T> classToTransformTo) {
    PoijiOptions options = PoijiOptions.PoijiOptionsBuilder.settings().addListDelimiter(";").build();
    List<T> data = Poiji.fromExcel(new File(filePath), classToTransformTo, options);
    return data;
}


public static void main(String [] args) {
    
    ReadingExcelUsingPoiji genericConverter = new ReadingExcelUsingPoiji();
    
    List<User> listOfUsers = genericConverter.transformExcelToClass("yourFilePath", User.class);
    List<Car> listOfCars = genericConverter.transformExcelToClass("yourFilePath", Car.class);
}
 

}

 public class LoadUserStepDfn extends LoadDataStepDfn<User> {

    
    
    @Given("^Data is loaded from "([^"]*)"$")
    public void data_is_loaded_from (String filePath) throws Throwable {
        super.data_is_loaded_from(filePath , User.class);
    }

}




public class LoadDataStepDfn<T> {

    public List<T> data;

    protected ReadingExcelUsingPoiji readingExcelUsingPoiji;

    protected void data_is_loaded_from(String filePath, Class<T> classToTransformTo) throws Throwable {
        data = readingExcelUsingPoiji.transformExcelToClass(filePath, classToTransformTo);

    }

}
 

Комментарии:

1. это выдает мне ошибку Требуемый тип: Class <T> При условии:Class<User> и переменная isUser, где я должен ее объявить

2. Я обновил свой ответ… можете ли вы посмотреть, поможет ли это 🙂

3. В Java имена методов начинаются со строчной буквы 🙂

4. У меня есть другой класс, который использует этот метод, там, где у меня появляется новая ошибка @When("^User login with the following username and password") public void user_login_with_the_following_username_and_password () throws Throwable { for (User user:loadDataStepDfn.data){ login.enterUsername(user.getUsername()); login.enterPassword(user.getPassword()); login.clilckOnConection(); } } в User user:loadDataStepDfn.data ошибке, в которой указано Требуемый тип: предоставленный объект: Пользователь

5. Ура. Я рад, что это помогло