【问题标题】:How to Write unit tests for this class如何为此类编写单元测试
【发布时间】:2015-07-17 10:56:00
【问题描述】:

我需要为这段代码编写一个单元测试。我只是在学习如何编写单元测试。我想知道可以为以下课程专门编写的测试用例是什么

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);    
  }

}

【问题讨论】:

  • 断言延迟前后的时间差,在一些允许的增量误差范围内?
  • 使用 JUnit 在 Java 8 中进行实用单元测试 - Jeff Langr 与 Andy Hunt 和 Dave Thomas 合着。我会推荐这本书。 (有点离题)
  • 测试检查生成的代码是否符合其规范。没有人能回答你的问题,因为你没有告诉我们你的代码规范。
  • 这不是代码编写服务或测试编写服务。

标签: java unit-testing junit


【解决方案1】:

您绝对不想等待真正的使用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 - 但您不必在此类测试中睡太久,也无需测量确切的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2018-01-17
    • 2012-01-06
    • 2019-03-17
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多