2014-01-13 48 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

谢谢!完美的解释。 –

相关问题