如何为此编写单元测试 class

How to Write unit tests for this class

我需要为这段代码写一个单元测试。刚刚在学习写unit tests.I 想知道下面的class 可以写什么测试用例 特别是

public void delay() 

方法。它包含 Thread.sleep() 方法。

 import org.apache.log4j.Logger;

public abstract class AbstractDelayService<T> implements DelayService<T>
{
  private static Logger log = Logger.getLogger(AbstractDelayServiceTest.class);

  protected DelayFunction delayFunction;
  protected FailureCounter<T> failureCounter;

  public AbstractDelayService(DelayFunction delayFunction, FailureCounter<T> failureCouner)
  {
    this.delayFunction = delayFunction;
    this.failureCounter = failureCouner;
  }

  @Override
  public void delay()
  {
    long delay = delayFunction.getDelay();
    log.info("Delaying lookup of" + " by " + delay + " ms");

    try
    {
      Thread.sleep(delay);
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
  }

  @Override
  public void reportSendSuccess(T key)
  {
    failureCounter.reportSendSuccess(key);   
  }

  @Override
  public void reportSendFailure(T key)
  {
    failureCounter.reportSendFailure(key);    
  }

}

您绝对不想等待真正使用 Thread.sleep 然后计算经过了多少时间 - 它既慢又不可靠。你必须注入 Sleeper 接口来测试 class,这样你就可以在测试中模拟 i。例如:

interface Sleeper {
    void sleep(long ms) throws InterruptedException;
}

...

class RealSleeper implements Sleeper {
    void sleep(long ms) throws InterruptedException {
        Thread.sleep(ms);
    }
}

...

private long time = 0;

@Test
public void test() {
    AbstractDelayService service = new AbstractDelayService(new Sleeper(){
        void sleep(long ms) {
            time+=ms;
        }, delayFunction, failureCouner){};
    Assert.assertEquals(time, 0);
    service.delay();
    Assert.assertEquals(time, 1000);
}

这样您就可以验证您的 class 睡眠是否与预期的一样长。 您仍然需要一些集成测试来确保 Thread.sleep 确实被调用 - 但您不必在此类测试中睡太久,也不需要测量确切的时间。