Выберите один из трех одинаковых компонентов свинга, используя AssertJ.

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

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] 

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


person Vadym    schedule 05.06.2018    source источник
comment
Есть совет? Не создавайте запутанный графический интерфейс. Как пользователь должен определить, какую из трех одинаковых кнопок активировать?   -  person Andrew Thompson    schedule 06.06.2018
comment
В панели у нас есть еще 3 панели, которые содержат любые элементы, и одним из этих элементов является эта кнопка с такими же именами.   -  person Vadym    schedule 06.06.2018
comment
Способ смутить это! Я не ближе к определению ответа на свой вопрос, чем был раньше.   -  person Andrew Thompson    schedule 07.06.2018
comment
Итак, я согласен с Вами, но у меня есть код, который я могу тестировать, но не редактировать. Лучший способ - изменить метод инициализации этих кнопок.   -  person Vadym    schedule 07.06.2018


Ответы (1)


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

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

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

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;
        }
    }
}
person Thomas Kläger    schedule 09.06.2018