簡體   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