Статьи

Чистые уведомления слушателя SWT с SWTEventHelper

Написание тестов для интерфейсов на основе SWT часто требует программного уведомления слушателей виджетов. К сожалению, код для создания, инициализации и, наконец, для запуска события немного многословен и отвлекает от реальной цели теста. Пару раз после написания подобных процедур инициализации я придумал небольшой служебный класс, который позволяет избежать этих избыточностей и сделать код несколько более выразительным 1

Класс называется SWTEventHelper и использует свободный стиль кодирования интерфейса в сочетании со статическим импортом 2, как известно, например, из Mockito . Следующие фрагменты демонстрируют использование на простом примере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
public class MouseDownCounter extends MouseAdapter {
 
  private int count;
 
  public MouseDownCounter( Control control ) {
    control.addMouseListener( this );
  }
 
  @Override
  public void mouseDown( MouseEvent event ) {
    count++;
  }
 
  public int getCount() {
    return count;
  }
}

Глядя на код MouseDownCounter можно считать необходимым убедиться, что событие MouseDownCounter мыши действительно увеличивает счет на единицу. С помощью SWTEventHelper такой тест может выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class MouseDownCounterTest {
 
  @Rule
  public final DisplayHelper displayHelper = new DisplayHelper();
 
  @Test
  public void testMouseDownIncreasesCount() {
    Composite parent = displayHelper.createShell();
    Control control = new Label( parent, SWT.NONE );
    MouseDownCounter counter = new MouseDownCounter( control );
 
    trigger( SWT.MouseDown ).on( control );
 
    assertEquals( 1, counter.getCount() );
  }
 
  [...]
}

Тест создает «реальный» SWT-контроль 3 в разделе сборки 4 теста. После этого элемент управления «оборачивается» нашим тестируемым MouseDownCounter . В следующем SWT.MouseDown разделе создается событие SWT.MouseDown с использованием SWTEventHelper#trigger(int) а прослушиватель, зарегистрированный в элементе управления Label уведомляется через SWTEventHelper#on(Widget) . И последнее, но не менее важное: раздел проверки гарантирует, что нажатие мыши фактически увеличило счетчик.

Кроме того, SWTEventHelper предоставляет метод конфигурации для каждого атрибута org.eclipse.swt.widgets.Event . Посмотрите на следующую строку кода, чтобы увидеть, как запустить уведомление о событии, например, с помощью определенного Event#keyCode :

1
trigger( SWT.MouseDown ).withKeyCode( SWT.BUTTON1 ).on( control );

Поскольку я использовал этот маленький помощник уже более ста раз, он может оказаться полезным и для других. Поэтому я настроил GitHub Gist, где вы можете скачать код SWTEventHelper : https://gist.github.com/fappel/9426554

Не стесняйся, попробуй!

  1. Выразительность, конечно, по крайней мере, в некоторой степени, в глазах смотрящего
  2. Eclipse предлагает возможность конфигурировать помощник по содержимому со статическим импортом через настройки предпочтений, что делает этот подход еще более удобным
  3. DisplayHelper сокращает трудоемкость печати за счет автоматической инициализации и удаления, связанных с Display . Вы можете найти описание и ссылку для скачивания в посте A JUnit Rule to Ease SWT Test Setup
  4. Форматирование тестов основано на шаблоне BUILD-OPERATE-CHECK (Роберт К. Мартин, Чистый код, Глава 9, Чистые тесты). Однако в реальном сценарии я бы, вероятно, выделил раздел сборки в отдельный метод.