Java 如何创建一个JUnit测试,直到满足某个条件为止?

Java 如何创建一个JUnit测试,直到满足某个条件为止?,java,testing,junit4,Java,Testing,Junit4,我有一个简单的java蛇游戏。我试着测试当我在短时间内按了很多键时会发生什么。 蛇是我的框架,板是一切发生的地方 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_u

我有一个简单的java蛇游戏。我试着测试当我在短时间内按了很多键时会发生什么。 蛇是我的框架,板是一切发生的地方

  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。 一切正常。。但它停在超过100的地方…不是每次都是相同的值。
请帮忙。这甚至可以实现吗?

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

因此,您需要启动测试,创建计时器,然后停止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()
,而无需后台线程(顺便说一句,这也将每秒为您提供数十万次调用)。

谢谢!!完美的解释。