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

Java 使用AssertJ从三个相同的swing组件中选择一个,java,swing,assertj,Java,Swing,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', requireSh

我使用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] 
使用matcher org.assertj.swing.core.matcher.JButtonMatcher找到多个组件[
name=,text='text',requireShowing=true]

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

解决您的问题的最好和最简单的方法是,您可以为按钮指定不同的名称

记住:组件的
名称
不同于它显示的
文本
!您的按钮都可以向用户显示“文本”,但仍然有“button1”、“button2”、“button3”等名称

在这种情况下,你可以写

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

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

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

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

最后也是最糟糕的一种可能是编写自己的
GenericTypeMatcher
/
NamedComponentMatcherTemplate
,它只返回与给定文本匹配的
n
th按钮

请小心

  • 如果所有其他方法都失败,这是一种绝望的措施
  • 这将导致脆弱的测试
  • 你不想这样做,除非绝对没有其他办法
有了这些警告,代码如下:

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;
        }
    }
}
公共类MyJButtonMatcher扩展了NamedComponentMatcherTemplate{
私有字符串文本;
私有整数索引;
公共MyJButtonMatcher(字符串文本,int索引){
super(JButton.class);
this.text=文本;
这个指数=指数;
要求显示(真实);
}
@凌驾
受保护的布尔值匹配(JButton按钮){
if(isNameMatching(button.getName())和&arePropertyValuesMatching(text,button.getText())){
返回索引--==0;
}否则{
返回false;
}
}
}

“有什么建议吗?”不要构建混乱的GUI。用户应该如何确定要激活的三个相同按钮中的哪一个?在面板中,我们有另外三个包含任何元素的面板,其中一个元素是这个按钮,它具有相同的名称来模糊它!我没有比以前更接近于确定我的问题的答案。所以,我同意你的观点,但我有代码,我可以测试,但不能编辑。最好的方法是更改初始化该按钮的方法。