Java 线程实现中run方法JUnit测试的优雅解决方案

Java 线程实现中run方法JUnit测试的优雅解决方案,java,junit,runnable,Java,Junit,Runnable,我有一个从Thread扩展而来的类,希望JUnit对其进行测试。此时,我不想测试线程安全性,只想检查实现逻辑是否工作正常。我的问题是run方法会无限期地迭代,例如: public void run() { while (status.isRunning()) { // do stuff & sleep } } 出于测试的目的,我只想在run方法中迭代逻辑一次。我想出的解决这个问题的最好办法是使用静态计数器和

我有一个从Thread扩展而来的类,希望JUnit对其进行测试。此时,我不想测试线程安全性,只想检查实现逻辑是否工作正常。我的问题是run方法会无限期地迭代,例如:

       public void run() {

        while (status.isRunning()) {

            // do stuff & sleep
        }
   }
出于测试的目的,我只想在run方法中迭代逻辑一次。我想出的解决这个问题的最好办法是使用静态计数器和Answer的匿名实现的Mockito mock对象:

  private static int counter = 0;

  Status status = mock(Status.class);
        when(status.isRunning()).thenAnswer(new Answer<Boolean>() {
            public Boolean answer(InvocationOnMock invocation) throws Throwable {
                if (counter == 0) {
                    counter++;
                    return Boolean.TRUE;
                }
                return Boolean.FALSE;
            }
        });
我不确定这个解决方案是否是最好的。对于一个常见的用例来说,这似乎有点冗长


有人能想出一个更简单、更优雅的解决方案吗?

您不需要做任何神奇的事情,只需在thenReturn方法中提供多个答案,例如

when(status.isRunning()).thenReturn(true, false);