[英]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.