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

Elegant solution for JUnit testing of run method in Thread implementation

我有一个从 Thread 扩展而来的 class 并且想要 JUnit 测试它。此时我不想测试线程安全,而只是检查实现逻辑是否正常。我的问题是 运行 方法无限迭代,例如:

       public void run() {

        while (status.isRunning()) {

            // do stuff & sleep
        }
   }

出于测试目的,我只想迭代一次 run 方法中的逻辑。我想出的解决这个问题的最好办法是 Mockito 模拟对象,它使用静态计数器和 Answer:

的匿名实现
  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"方法中提供多个"answer",例如...

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