java - robolectric 单元测试 android Timer

标签 java android unit-testing robolectric timertask

我正在为 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),所以我尝试使用 ShadowLooperRobolectric 类的方法,但无济于事。目前我必须使用 Thread.sleep(),但它相当不方便。

有没有办法强制 Timer 执行预定的 TimerTasks,比如使用 ShadowLooper.runToEndOfTasks() 来执行 预定的 Runnables >处理程序 ?

最佳答案

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

这里是关于如何创建自己的 ShadowTimer 类的基本说明 http://robolectric.org/extending/

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

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

关于java - robolectric 单元测试 android Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39408871/

相关文章:

java - 创建数据库时将数据添加到sqlite数据库

java - 将 MapWritable 转换为字符串

ruby - 如何使用 ruby​​ 为 Kubernetes 集群资源创建单元测试

visual-studio-2010 - 没有 Visual Studio 的 MS 单元测试框架

支持可选参数和 .Net 4.0 的 C# Mocking Framework

java - 我可以在 ActionBarActivity 中动态填充 ListView 吗?

java - JAVA 1.5 中的 XML 规范化

android - 哪个属性在 Android-Studio 2.2 中替换为 "relativePercent"

android - 如何在android中使用多个数据库,如多种语言

c# - 我的着色器在桌面上工作,但屏幕在 Android 上变黑