#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. Ура. Я рад, что это помогло