Как проверить JButton ActionListener из метода? (модульное тестирование)

Я создаю настольную игру в Eclipse и пытаюсь провести юнит-тестирование. Для моего модульного тестирования я использую Junit и EclEmma. Внутри класса я пытаюсь проверить, что если нажата кнопка (newGameButton), она переместит проигрыватель на панель содержимого "Сведения об игроке".

Вот соответствующая часть кода для JButton:

public void createGUI() {
    JButton newGameButton = new JButton("New Game");
    newGameButton.setToolTipText("Click to start a new game");
    newGameButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            CardLayout cardLayout = (CardLayout) contentPane.getLayout();
            cardLayout.show(contentPane, "Player Details");
        pack();
    }
});

И мой тестовый код (в отдельном классе):

@Test
public void testHomeButtonMainMenu()
{
    appTest.createGUI();
    appTest.newGameButton.doClick(); // I know this isn't correct, I'm trying to simulate newGameButton being pressed
    Assert.assertTrue(); // somehow test that the game is on the player details
}

Кто-нибудь знает, как исправить код нажатия JButton newGameButton и какой тест написать, чтобы показать, что тест прошел успешно?

Спасибо

2 ответа

Я бы разделил ваше тестирование на две совершенно разные части. Модульное тестирование кода в графическом интерфейсе и использование чего-то вроде WindowLicker для управления фактическим интерфейсом.

В книге " Растущее объектно-ориентированное программное обеспечение: руководство по тестам" рассказывается об этом, а также о том, как разделить ваши тесты, чтобы сделать их более управляемыми и дать вам гораздо более продуманную и гибкую систему.

Вы используете анонимный внутренний класс. В этом нет ничего плохого, хотя это и некрасиво. Однако, что неправильно в том, что касается TDD, так это в том, что он содержит больше, чем вызов одного метода включающего класса. Если вы напишите так, вы можете легко протестировать этот метод без необходимости нажимать какие-либо кнопки;)

Тест подтвердил бы изменения состояния класса, в который был включен метод, ожидаемый при выполнении метода. Поскольку этот метод имеет смысл быть недействительным, вы не можете утверждать что-либо еще в модульном тесте.

Чтобы сделать еще один шаг вперед, команда, которая выполняется на кнопке, не обязательно должна располагаться рядом с компонентом пользовательского интерфейса, в котором есть эта кнопка (на самом деле многие кнопки затрагивают в основном другие компоненты). Вам просто нужно создать абстракцию, чтобы помочь вам обойти командные объекты. Если вы заинтересованы, вы можете взглянуть на этот пост http://bo2framework.blogspot.gr/2013/08/bo2-concepts-part-1-service-panels.html

Что касается тестирования GUI, вам, скорее всего, понадобится инструмент для тестирования черного ящика. К сожалению, я не знаком с тестированием черного ящика приложения Swing, но "тестирование черного ящика Swing" было бы хорошим первым поиском в Google.

Другие вопросы по тегам