我正在为Android应用编写单元测试,这些代码我不应该改变。我使用java.util.Timer
测试了一段代码时遇到了问题。我正在寻找一种方法来使任务立即执行,而无需等到预定的时间。因为它是作为本地对象创建的,所以我无法用Mockito来嘲笑它。
public void testedMethod() {
long time = 9999;
final Timer timer = new Timer()
timer.schedule(new TimerTask() {
@Override
public void run() {
//do stuff
}
}, time);
}
@Test
public void test() throws Exception {
testedObject.testedMethod();
Thread.sleep(10000);
//verify that stuff was done
}
我使用的是Robolectric(3.1),所以我尝试过使用ShadowLooper
和Robolectric
类的方法,但无济于事。目前我必须使用Thread.sleep()
,但它相当不方便。
有没有办法强制Timer
执行预定的TimerTasks
,比如使用ShadowLooper.runToEndOfTasks()
执行Handler
计划的Runnables?
答案 0 :(得分:1)
要像Handler类一样立即启动任务,您可以创建自己的ShadowTimer类来支持此行为。 ShadowLooper仅适用于处理程序任务,而不适用于计时器任务。
以下是如何创建自己的ShadowTimer类http://robolectric.org/extending/
的基本说明当您可以更改现有代码时,请使用Android处理程序机制而不是遮蔽计时器类。所有您需要的东西都是开箱即用的。
Handler handler = new Handler();
handler.postDelayed(runnable, 100);