Как протестировать графический интерфейс Swing в безголовой среде?JAVA

Программисты JAVA общаются здесь
Anonymous
Как протестировать графический интерфейс Swing в безголовой среде?

Сообщение Anonymous »

Предположим, я хочу протестировать это простое расширение JButton

Код: Выделить всё

package app;

import solution.common.utils.MathConverter;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JDropdownButton
extends JButton
implements ActionListener {
private JPopupMenu popupMenu;

public JDropdownButton() {
this(null, null);
}

public JDropdownButton(String text, Icon icon) {
super(text, icon);
super.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
if (null == popupMenu || null == popupMenu.getSubElements()) {
return;
}

if (!popupMenu.isVisible()) {
Point p = getLocationOnScreen();
popupMenu.setLocation(MathConverter.doubleToInt(p.getX()),
MathConverter.doubleToInt(p.getY()) + getHeight());
popupMenu.setVisible(true);
}
}

public void setDropdownMenu(JPopupMenu menu) {
popupMenu = menu;
if (popupMenu != null) {
popupMenu.setInvoker(this);
}
}
}
На данный момент меня интересует только проверка того, отображается ли всплывающее окно при нажатии кнопки. Если я запущу это

Код: Выделить всё

package app;

import org.junit.jupiter.api.Test;

import javax.swing.*;
import java.awt.event.ActionEvent;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

class JDropdownButtonTest {
@Test
void actionPerformed_showsPopup() {
JDropdownButton dropdownButton = new JDropdownButton();
JPopupMenu popupMenu = new JPopupMenu();
dropdownButton.setDropdownMenu(popupMenu);
//        JFrame frame = new JFrame();
//        frame.add(dropdownButton);
//        frame.setVisible(true);
assertFalse(popupMenu.isVisible());
dropdownButton.doClick();
assertTrue(popupMenu.isVisible());
}
}
Я понимаю

Код: Выделить всё

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location

at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:2062)
at java.awt.Component.getLocationOnScreen(Component.java:2036)
at app.JDropdownButton.actionPerformed(JDropdownButton.java:50)
Таким образом, оно должно отображаться. Поскольку Mockito не может отличить настоящий вызов от вызова настройки, это вызовет то же исключение

Код: Выделить всё

    @Test
void actionPerformed_showsPopup() {
JDropdownButton dropdownButton = spy(JDropdownButton.class);
given(dropdownButton.getLocationOnScreen()).willReturn(new Point(0,0));
JPopupMenu popupMenu = new JPopupMenu();
dropdownButton.setDropdownMenu(popupMenu);
//        JFrame frame = new JFrame();
//        frame.add(dropdownButton);
//        frame.setVisible(true);
assertFalse(popupMenu.isVisible());
dropdownButton.doClick();
assertTrue(popupMenu.isVisible());
}
Я могу раскомментировать эти строки, тест проходит нормально, но тогда сборка CI на сервере TeamCity завершится сбоем с «безголовым исключением», поскольку графическая среда не будет доступна
Поэтому мне нужен надежный тест графического пользовательского интерфейса, который можно было бы запустить и в автономной среде.
Как мне это сделать? Является ли обновление образа Docker CI-сервера единственным решением?

Подробнее здесь: https://stackoverflow.com/questions/788 ... nvironment

Вернуться в «JAVA»