Как запустить события Swing GUI для модульного тестирования - PullRequest
0 голосов
/ 22 декабря 2018

Я разрабатываю свинг-приложение с использованием TDD.Моя логика прекрасно развязана и активируется при прослушивании событий фокуса.Но я не могу запускать эти события программно.

Я думал, что field.requestFocus() вызовет focusGained (), но это не так.Я читал, что это может быть потому, что нет дисплея.

import junit.framework.TestCase;
public class SomeClassTest extends TestCase{
    @Test
    public void testSomeMethod() {
        someLogic();
        for (JTextField field : fields[]){
            field.requestFocus();
            assertTrue(condition);
            ...
    }

Как запустить FocusEvents как focusGained, так и focusLost?учитывая, что это для тестирования junit, вариант без GUI был бы замечательным.

Редактировать: Используя образец в ответе, я смог запустить все виды событий, связанных с GUI, надеюсь, это поможет.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Я смог запустить нужный мне метод, используя decorator pattern, чтобы обернуть мои JTextFields в их собственный слушатель.Поскольку поле DecoratedJText реализует focusListener, для него можно легко вызвать метод focusGained ().

Вот пример класса декоратора:

public class SmartTextField implements FocusListener{
private JTextField field;
public SmartTextField(JTextField field) {
    this.field = field;
}
@Override
public void focusGained(FocusEvent e) {
    System.out.println(e);
    //Here you can add logic that applies to the field, e.g.
    field.selectAll();
    ...
}
@Override
public void focusLost(FocusEvent e) {
    System.out.println(e);
    ...
}
public JTextField getField() {
    return field;
}

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

@Test
public void testSomeMethod() {
    ...
    for (SmartTextField field : SmartTextFieldCollection())
        field.focusGained(new FocusEvent(field.getField(),FocusEvent.FOCUS_GAINED));
        field.focusGained(null);
        assertTrue(condition);
        ...
}

Бонус за код!Для реализации просто добавьте украшенное поле в качестве слушателя фокуса, оно будет хорошо работать как при запуске, так и при тестировании:

JTextField field = new JTextField();
SmartTextField smartTextField = new SmartTextField(field);
field.addFocusListener(smartTextField);

Это было особенно полезно, потому что теперь у меня есть самодостаточный и простой для тестирования textField.Декоратор реализует собственную логику полей, например, проверку данных и, в моем случае, подготовку информации для последующего обновления, надеюсь, это поможет.Я действительно гордился своим решением.

0 голосов
/ 22 декабря 2018

Я читал, что это может быть потому, что нет дисплея.

Правильно, только видимый компонент в видимом графическом интерфейсе может получить фокус.Тогда FocusEvent будет сгенерирован автоматически.

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

Вы можете использовать:

field.dispatchEvent(...);

Затем вы отправите событие focusGained.

Не знаю, сработает ли это, или же метод dispatchEvent() также проверяет, должен ли компонент быть видимым.

...