代码之家  ›  专栏  ›  技术社区  ›  Vadym

使用assertj从三个相同的swing组件中选择一个

  •  0
  • Vadym  · 技术社区  · 6 年前

    我使用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] 
    

    因为我在一个表单中有三个相同的组件,我不能更改这个组件的名称或标题。有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Thomas Kläger    6 年前

    解决问题的最好和最简单的方法是给按钮起不同的名字。

    记住:那个 name 一个组件的 text 它显示出来了!您的按钮可能都向用户显示“文本”,但仍有“button1”、“button2”、“button3”等名称。

    在这种情况下你可以写

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

    下一种可能是为包含按钮的面板指定不同的名称,例如“panel1”、“panel2”、“panel3”。

    如果你能实现这一点,你可以写

    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;
            }
        }
    }