Как проверить 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.