2015-07-02 2 views
0

Я сделал игру, в которой пользователь и ИИ по очереди поворачивают кости. Игра автоматически переходит на ход ИИ и возвращается к повороту пользователя. Я использовал JOptionPane.showMessageDialog, чтобы открыть диалоговое окно с уведомлением пользователя о том, что это их очередь. Итак, все это работает нормально, но когда я запускаю тестовый класс JUnit для проверки метода hold(), всплывающее окно появляется. Есть ли способ подавить всплывающее окно или автоматически закрыть окно в классе JUnit Test?JUnit тестирование метода с помощью JOptionPane.showMessageDialog

public void hold() { 

    this.swapWhoseTurn();   
    this.setChanged(); 
    this.notifyObservers(); 

    if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) { 
     this.theComputer.takeTurn(); 
     this.hold(); 
     HumanPlayerPanel.turnAlert(); 
    } 

TurnAlert является статическим методом в другом классе под названием HumanPlayerPanel. Вот код.

public static void turnAlert() { 
    JOptionPane.showMessageDialog(null, "It is your turn"); 
    } 

Я видел, что я могу вызвать метод doClick на кнопку OK_Option, но я не слишком уверен, как найти эту кнопку. Любая помощь приветствуется.

+1

У меня нет большого опыта работы с JUnit, но из понимания это не очень хорошо подходит для тестирования пользовательского интерфейса. Вам нужно использовать фреймворк, который может взаимодействовать с пользовательским интерфейсом в пределах его потока (Event Dispatching Thread) и который может взаимодействовать с различными компонентами (например, с кнопкой). – MadProgrammer

+0

Я нашел это [ссылка] http://stackoverflow.com/questions/15597425/how-do-simulate-a-button-click-in-a-swing-pop-up-dialog, но я не понимаю, как переопределить метод, вызывающий окно JOptionPane.showMessageDialog в тестовом классе JUnit – mediumM

ответ

0

Refactor если заявление следующим образом:

if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) { 
     this.theComputer.takeTurn(); 
     this.hold(); 
     HumanPlayerPanel.turnAlert(); 
    } 

выглядеть следующим образом:

... 
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) { 
     this.theComputer.takeTurn(); 
     this.hold(); 
     alertHumanPlayer(); 
    } 
... 

protected void alertHumanPlayer(){ 
    HumanPlayerPanel.turnAlert(); 
} 

Давайте предположим, что выше класс называется Game. В тестовом коде, расширить класс игры следующим образом:

... 
public class GameWithNoHumanAlert extends Game{ 
    @Override 
    protected void alertHumanPlayer(){ 
     // Do not show alert 
     // HumanPlayerPanel.turnAlert(); 
    } 
} 

@Test 
public void uiTest(){ 
    GameWithNoHumanAlert game = new GameWithNoHumanAlert(); 

    ... 
    // Do your testing normally now. 

} 

__UPDATE__

Другой, и ИМХО лучше, идея будет использовать mock testing. Я лично попробовал несколько из них, и я предлагаю вам взглянуть на Jmockit. Это почти тривиально, чтобы справляться с такими проблемами с ним, чтобы вы могли сосредоточиться на том, что вам нужно/нужно протестировать.

Cheers.

+0

Ничего себе это здорово! Я на самом деле просто решил переместить JOptionPane.showMessageDialog в класс представления и вызвал его там. Поскольку мне не нужно запускать JUnit-тестирование в GUI-классах, мне не нужно было всплывать. Я ценю ваши усилия, хотя! Этот форум никогда не перестает удивлять меня. Спасибо! – mediumM

Смежные вопросы