t.me/atinfo_chat Telegram группа по автоматизации тестирования

Тест не видит методы одного из наследуемых классов

java
testng
selenium
Теги: #<Tag:0x00007f9c55cb6300> #<Tag:0x00007f9c55cb6148> #<Tag:0x00007f9c55cb6008>

(Necrosium) #1

Привет.

Java+testNG+maven
Ситуация у меня следующая, есть тест:

image

уровень наследования:
p2pPage extends CardForm
CardForm extends BaseTest

методы
enterSenderCardNumber
enterReceiverCardNumber
находятся в классе CardForm
остальные методы находятся в классе p2pPage

В общем-то, при форме записи, как показано на скрине выше - все работает.
Но, к этому я уже пришел, после того как пол дня пытался понять почему не отрабатывает такая форма записи:

image

при такой форме записи, у меня тест напрочь не видит методы, которые хранятся в классе p2pPage.

Кто-то может подсказать, пожалуйста:

  1. почему форма записи 2 не работает?
  2. Есть ли какой-то способ сделать так, чтобы вторая форма записи начала работать. Она удобней)

#2

enterReceiverCardNumber что возвращает?


(Vladislav Sobol) #3

enterReceiverCardNumber должен возвразать обьект этого же класса


(Necrosium) #4

image


(Necrosium) #5

прикрепил скрин


#6

a enterAmount небось находится на p2pPage?


(Necrosium) #7

да, я это указал в описании темы.
Я уже понял, что т.к. он возвращает объект типа CardForm, то следующий метод вызванный по цепочке через точку, пытается работать с тем объектом который вернул предыдущий метод.

у меня теперь другой вопрос. А имеет ли смысл заморачиваться и возвращать из CardForm объект типа p2pPage или просто писать тесты в форме первой записи и не морочить себе голову?
p.s. CardForm это такой себе вспомогательный класс (это не страница.), методы которого используются на многих страницах, где необходимо заполнять форму карты.


(Valentin G ) #8

Всегда использовал первый способ, по правде говоря, до недавнего времени не понимал толком, как работает второй способ. Да и дебажить в случае чего удобнее.
Еще, какой способ использовать, зависит от подхода, который ты используешь в тестах. В BDD подходе, где ты используешь Steps, такое мало подходит, если ты используешь без бдд, то там есть смысл использовать второй подход.


(Viktor) #9

Потому что кастить нужно к нужному типу, в C# это выглядит так
image


#10

Второй подход и с бдд можно использовать.
А лучше всего использовать тот который удобен лично тебе


(Vladislav Sobol) #11

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


(Viktor) #12

Это все делается дженриками, не надо ничего прерывать вообще). Даже навигируясь между страницами и закрывая одинаковый попап одним методом на разных страницах


(Necrosium) #13

почитал за дженерики, (никогда их не юзал), суть/принцип работы в принципе ясен, но непонятно только, какие преимущества реализация через дженерик даст для автотестов?


(Viktor) #14

позволят вызывать методы как на втором вашем скриншоте. Посмотрите на мой скриншот, на нем пример, который решает вашу проблему. (никогда их не юзал) - листы это тоже дженерики, так что юзали :slight_smile:


(Михаил Братухин) #15

@Viktor_Yakushenko всё правильно сказал, можно в базовом классе определить тип дженерика и возвращать не текущий объект this, а приведенный к типу. Правда в Java есть кое-какие приколы с дженериками. Советую вот это видео по ним глянуть:

P.S. и да, писать на джаве без дженериков… скорее всего вы их сами не создавали, но точно применяли из стандартной библиотеки (листы, массивы, мапы, деревья и т.д.)


(Михаил Братухин) #16

Хм… с дженериками в Java реально есть подвох. Возможно решения через них и не будет. Накидал у себя простенький пример и в нём дженерик не помог. Или я что-то на ночь глядя сделал не так.

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


(Viktor) #17

Мне кажется что не так, там не должно быть джененрика у наследника, только у базового, и инициализировать нужно только наследника


(Михаил Братухин) #18

Так не будет работать. Если я правильно помню, то у C# и Java есть различия в реализации generic’ов.

Этот способ не работает по аналогии с тем, как в List<Number> мы не можем положить Integer, хотя он и наследуется от Number, точнее положить можем, но доставать будем назад только Number.
%D0%94%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D0%BA


(Viktor) #19

Нашел у нас на форуме, в данном случае на Java все также работает как на C#
Base

Child


(Михаил Братухин) #20

Это не совсем то. Если использовать строителя как у топикстартера, т.е. через точку вызывать методы у родительского и дочернего класса с возвратом на самого себя через this, то в этом случае метод должен иметь тип T и этот тип должен быть в описании класса. Но в java есть проверка на типобезопасность у дженерика. В итоге берется самый младший известный тип, т.е. для обычного T это будет Object, а для T extends CardPage это будет CardPade. Поэтому сама джава не даст вызвать методы наследника при таком приведении.

А вообще у ТСа все в куче и пейджы наследуют от BaseTest и т.д.