【发布时间】:2015-03-03 20:40:13
【问题描述】:
我必须对一个暂停执行的方法进行单元测试(定期做一些工作):
void m() {
do {
doSomeWork();
Thread.sleep(1000);
} while (condition);
}
我必须测试的是多个 while 循环执行并检查 doSomeWork() 是否已正确完成。所以目前我的测试是这样的:
1) 在新线程中开始执行 m()。
2) 在主线程中:Thread.sleep(1000 + 200);
3) 在主线程中断言工作已经正确完成。
4) 在主线程中:Thread.sleep(1000 + 200);
5) 在主线程中断言工作已经正确完成。
6) 和一次 4 和 5
问题是不同机器上的 doSomeWork() 需要不同的时间,并且很难在测试中找到一个好的等待值。
我看到这种情况的一种常见方法是抽象出睡眠时间,并且在测试代码中不要等待: C# Unit Testing - Thread.Sleep(x) - How to Mock the System Clock
但我确实必须验证实现是否正在等待。
您对如何为这种情况编写健壮的单元测试代码有什么建议吗?它还可能涉及重构 m() 方法。
【问题讨论】:
-
正如你所提到的,你最好模拟时钟,你会想要在你增加时钟之前断言该函数没有被调用,然后在你增加它之后检查它是否被调用。
-
你有什么理由不接受这个答案?
标签: java multithreading unit-testing