Java аннотации, удаляющие строковые литералы из них? - PullRequest
4 голосов
/ 30 сентября 2011

Не уверен, что это приличный вопрос или нет, но он здесь. Мы пытаемся реализовать среду тестирования пользовательского интерфейса (селен-веб-драйвер) и хотим использовать дизайн, управляемый страницей, например

class HomePage {
@FindBy(how = How.Id, id="myPageHeaderID")
private String pageHeader

В приведенном выше простом примере мне нужно жестко закодировать строковый литерал myPageHeaderID. Одно из предложенных требований заключается в том, что мы можем извлечь «myPageHeaderID» из свойства как по причинам обслуживания (без развертывания кода, если что-то меняется), так и по причинам интернационализации. Я искал вокруг и, вероятно, не делал правильный поиск, но есть ли способ сделать то, что я спрашиваю выше?

Ответы [ 3 ]

0 голосов
/ 12 октября 2011

Я кратко пошел по этому пути, но из-за нашего приложения это было не совсем достижимо (страницы не всегда отображаются в одном и том же порядке после посещения страницы).

public class PageElement implements WebElementAdapter, Locatable {

  private How how;
  private String using;
  private boolean required;

  @FindBy(how = How.ID_OR_NAME, using = DEFAULT_LOCATION_STRATEGY)
  private WebElement backingElement;

  public PageElement(How how, String using using) {
    this.how = how;
    this.using = using;
    this.required = true;
  }

  /** 
   * This is how the overriding of the element location is done.  I then injected
   * these values in a spring configured bean file.
   *
   * This is needed on your config file:
   * default-lazy-init="true" default-init-method="initialize">
   */
  public final void initElement() {
    if (backingElement == null || isStale() {
      backingElement = getDriver().findElement(getLocationStrategy());
    }
  }

  public By getLocationStrategy() {
    By by = new ByIdOrName(using.replace(DEFAULT_LOCATION_STRATEGY, using));

    switch(how) {
      case CLASS_NAME:
        by = By.className(using.replace(DEFAULT_LOCATION_STRATEGY, using));
        break;
      //Do for others
    }
    return by;
  }

  public WebElement getBackingElement() {
    return backingElement;
  }
}

public interface WebElementAdapter {
  WebElement getBackingElement();
}

public interface Locatable {
  By getLocationStrategy();
}

Затем я создал общие виджеты в POJO и внедрил их в объекты страницы, которые были коллекцией этих виджетов.

Оттуда у меня был простой тестовый комплект, который отвечал за принятие строк (которые затем выполнялись.он позволял писать тестовые сценарии в SpEL и действовать на бинах, которые были введены.

Это было то, что я считал довольно аккуратным проектом, но мне пришлось отложить его, чтобы сделать некоторые другие вещи.

0 голосов
/ 12 октября 2011

Аннотации по существу метаданные . Если взять, например, метаданные базы данных , было бы странно, если бы Oracle база данных превратилась в MySQL, верно? Вот статья о Трансформаторах аннотаций в TestNG. Сам не пробовал, но думаю, что так или иначе может быть реализовано.

0 голосов
/ 30 сентября 2011

AFAIK, вы можете вызывать метод из аннотации.

@FindBy(how = How.Id, id=getProp())
private String pageHeader;

private String getProp()
{
    String prop = //whatever way you want to get the value
    return prop;
}

Разве это не работает?

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