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