2014-01-13 51 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變量循環它。我將它們傳遞給JPanel的keyListener。 一切工作正常..但它停止在一百多...每次都不相同的價值。 請幫忙。這甚至有可能實現嗎?

回答

1

計時器是一個守護線程,即當它們中的一個在附近時,它不會阻止VM停止。

所以會發生什麼是你開始測試,創建計時器,然後停止虛擬機(因爲沒有更多的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

謝謝!完美的解釋。 –

相關問題