2014-01-13 3 views
0

У меня есть простая игра-змея java. Я пытаюсь проверить, что происходит, когда я нажимаю много ключей за короткий промежуток времени. Змея - моя рамка, а Совет - это JPanel, где все происходит.Как создать тест JUnit, который выполняется до тех пор, пока не будет выполнено определенное условие?

boolean stop=false; 
    Snake snake= new Snake(); 

    KeyEvent key_right = new KeyEvent(snake.board, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_RIGHT,'Z'); 
    KeyEvent key_up = new KeyEvent(snake.board, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_UP,'Z'); 
    KeyEvent key_down = new KeyEvent(snake.board, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_DOWN,'Z'); 
    KeyEvent key_left = new KeyEvent(snake.board, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_LEFT,'Z'); 
    KeyEvent vect[]={key_right,key_down,key_left,key_up}; 
    int i=0,nr=0; 
    Timer timer = new Timer(); 
@Test 
public void StresTaste() { 

    timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     if(!stop){ 

     snake.board.getKeyListeners()[0].keyPressed(vect[i]); 
     System.out.println(nr); 
     i++;nr++; 
     if(i==3) i=0; 
     if(nr==200){stop=true;} 
     } 





    } 
    }, 1, 1);   

} 

Я создаю массив keyEvents и перебираю его через переменную i. Я передаю их в keyListener JPanel. Все работает нормально .. но оно останавливается на чем-то более ста ... не одинаковое значение каждый раз. Пожалуйста, помогите. Можно ли это реализовать?

ответ

1

Таймер - это поток демона, то есть когда один из них находится вокруг, что не остановит остановку виртуальной машины.

Итак, вы начинаете тесты, создаете таймер и останавливаете виртуальную машину (потому что тестов JUnit больше нет). Таймер обрабатывается пару раз, но в конечном итоге завершение работы VM убивает его.

Решение добавить блокировку в код:

final Object lock = new Object(); 

timer.scheduleAtFixedRate(new TimerTask() { ... 

    if(stop) { synchronized(lock) { lock.notify(); }} // let test know that we're done 
}); 

synchronized(lock) { lock.wait(); } // wait for timer to finish 

Тем не менее, это, вероятно, бесполезно, чтобы проверить, сколько нажатиями ваш код может обрабатывать в секунду. Аппаратное обеспечение, ОС и человеческие руки ограничивают около 215 слов в минуту.

Чаще всего код не заботится о том, как быстро он называется, но как часто (утечка памяти). Поэтому вы, вероятно, можете изменить свой код, чтобы просто перебрать последовательность ключей и просто вызвать snake.board.getKeyListeners() без фонового потока (который, кстати, также даст вам сотни тысяч вызовов в секунду).

+0

спасибо! Отличное объяснение. –

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