如何为此编写单元测试 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
确实被调用 - 但您不必在此类测试中睡太久,也不需要测量确切的时间。
我需要为这段代码写一个单元测试。刚刚在学习写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
确实被调用 - 但您不必在此类测试中睡太久,也不需要测量确切的时间。