繁体   English   中英

如何编写此类的单元测试

[英]How to Write unit tests for this 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接口注入经过测试的类,以便可以在测试中模拟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);
}

这样,您可以验证您的班级是否完全按照预期的时间入睡。 您仍然需要进行一些集成测试以确保Thread.sleep实际上已被调用-但是您不必在此类测试中长时间睡眠,也不需要测量确切的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM