【问题标题】:robolectric unit test android Timerrobolectric 单元测试 android Timer
【发布时间】:2016-09-09 09:58:24
【问题描述】:

我正在为 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?

【问题讨论】:

    标签: java android unit-testing robolectric timertask


    【解决方案1】:

    要像 Handler 类一样立即开始您的任务,您可以创建自己的 ShadowTimer 类来支持这种行为。 ShadowLooper 仅适用于处理程序任务,不适用于计时器任务。

    这里是一个基本的解释如何创建你自己的ShadowTimer类http://robolectric.org/extending/

    当您可以更改现有代码时,请使用 Android 处理程序机制而不是隐藏计时器类。您需要的所有东西都是开箱即用的。

    Handler handler = new Handler();
    handler.postDelayed(runnable, 100);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多