Выберите один из трех идентичных компонентов свинга, используя AssertJ - PullRequest
0 голосов
/ 05 июня 2018

Я использую AssertJ для тестирования моего приложения свинга.Когда я пытаюсь использовать этот код

frame.button(JButtonMatcher.withText("text").andShowing()).click();` 

, я получаю эту ошибку:

Found more than one component using matcher org.assertj.swing.core.matcher.JButtonMatcher[
    name=<Any>, text='text', requireShowing=true] 

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

1 Ответ

0 голосов
/ 09 июня 2018

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

Помните: name компонента отличается от text, который он отображает!Все ваши кнопки могли бы показывать «текст» пользователям, но при этом иметь названия вроде «button1», «button2», «button3».

В этом случае вы могли бы написать

frame.button(JButtonMatcher.withName("button1").withText("text").andShowing()).click();

Следующая возможность состоит в том, чтобы дать панелям, содержащим кнопки, разные имена, например, «панель1», «панель2», «панель3».

Если вы можете реализовать это, вы можете написать

frame.panel("panel1").button(JButtonMatcher.withText("text").andShowing()).click();

Последняя и худшая возможность - написать собственную GenericTypeMatcher / NamedComponentMatcherTemplate, которая возвращает только n -ую кнопку, соответствующую данному тексту.

ПОЖАЛУЙСТА, ВНИМАНИЕ :

  • это отдельная мера, если все другие подходы не пройдут
  • Это приведет к хрупким тестам
  • Вы не хотите делатьэто если нет абсолютно никакого другого пути!

С этими предупреждениями на месте, это код:

public class MyJButtonMatcher extends NamedComponentMatcherTemplate<JButton> {

    private String text;
    private int index;

    public MyJButtonMatcher(String text, int index) {
        super(JButton.class);
        this.text = text;
        this.index = index;
        requireShowing(true);
    }

    @Override
    protected boolean isMatching(JButton button) {
        if (isNameMatching(button.getName()) && arePropertyValuesMatching(text, button.getText())) {
            return index-- == 0;
        } else {
            return false;
        }
    }
}
...