Хм… Java 8 дает возможность обойти наследование от одного класса, с помощью интерфейсов с дефолтной реализацией… Возможно это противоречит ООП, но для автоматизатора может существенно пригодиться и решить кое какие задачи
Почти полноценное множественное наследование…
Такие интерфейсы не хранят состояние, но могут иметь какое-то дефолтное поведение.
public interface Validator {
@Step("Verify that \"{1}\" = \"{0}\"")
default void verifyTextEquals(final String actual, final String expected, final String message) {
assertEquals(actual, expected, message);
}
@Step("Verify that \"{1}\" = \"{0}\"")
default void verifyTextEquals(final String actual, final String expected) {
assertEquals(actual, expected);
}
@Step("Verify that \"{0}\" contains \"{1}\"")
default void verifyTextContains(final String actual, final String containsString) {
assertTrue(actual.contains(containsString));
}
@Step("Verify that \"{0}\" not contains \"{1}\"")
default void verifyTextNotContains(final String actual, final String containsString) {
assertTrue(!actual.contains(containsString));
}
}
в тесте можно использовать так:
public class Login extends BaseTest implements Validator {
@Title("Main logIn form")
@Test(enabled = true, groups = "Login", priority = 10)
public void signIn() {
//------------------- Test Data -------------------//
String name = "qa-login";
String pass = "qa-pass";
// --------------------- Test Case ----------------------//
PopUp popUp = loginPage().open("/login.html").loginWith(name, pass);
verifyTextEquals(popUp.getTitleMessages(), "111!");
}
}
Я вот кстати не совсем уверен, можно ли такое применять, но работкает и решает некие проблемки
А классический интерфейс, где идет описание и класс с реализацией, мне так и не удалось придумать куда бы применить, и не было еще такой задачи, чтобы интерфейсы решили какую-то проблему…
А вот абстрактные классы, напротив - могут хранить состояние и в них можно скинуть кучу каких-то методов, которые могут использоваться в дочерних классах… Или же объявить там абстрактные методы…
public abstract class BaseScreen<T extends BaseScreen<T>> {
private static final Logger logger = LogManager.getLogger(BaseScreen.class);
public abstract T chooseContact(SocialAppSection socialAppSection);
public abstract T sendTextMessages(SocialAppSection socialAppSection);
public abstract T sendLikeButtonInMessage();
public abstract T sendPhotoInMessage();
public abstract T sendVideoInMessage(int longPressTime);
public abstract T sendAttachInMessage();
}