如何创建在满足特定条件之前运行的JUnit测试?

时间:2014-01-13 16:27:23

标签: java testing junit4

我有一个简单的java蛇游戏。我正试图测试当我在很短的时间间隔内按下很多按键时会发生什么。 Snake是我的框架,Board是JPanel,一切都在这里发生。

  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 个答案:

答案 0 :(得分:1)

计时器是一个守护程序线程,即当其中一个存在时,它不会阻止VM停止。

所以会发生的是你开始测试,创建计时器然后停止VM(因为没有更多的JUnit测试)。计时器可以处理几次,但最终,终止虚拟机将其终止。

解决方案是为您的代码添加一个锁:

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()(顺便提一下,每秒钟也会提供数十万次调用)。