【问题标题】:Permission in Android test caseAndroid 测试用例中的权限
【发布时间】:2011-06-08 23:14:28
【问题描述】:

我的应用程序应该在一段时间(几小时或几天)后发生一些变化,我想测试一下。

我尝试在我的单元测试中使用 SystemClock.setCurrentTimeMillis() 来模拟时间/日期的变化,但没有任何运气。

我在应用程序和测试应用程序的清单中声明了<uses-permission android:name="android.permission.WRITE_SETTINGS" />,这并没有改变任何东西。

此时,我正在模拟器上运行这些测试,如果这有什么不同的话......

编辑:在 Nick 的帮助下,还请求了 SET_TIME 权限:

<uses-permission android:name="android.permission.SET_TIME" />

但是现在,logcat 显示:

WARN/PackageManager(59): Not granting permission android.permission.SET_TIME to package com.matthieu.tests (protectionLevel=3 flags=0xbe46)

另一个编辑:用 dtmilano 的回答...

在我的测试中添加了这段代码(使用正确的 try/catch):

Runtime.getRuntime().exec("date \"$((10800 + $(date +%s)))\"").waitFor();

当我在 shell 上运行时,我可以毫无问题地运行该命令,并且我看到模拟器中的时间发生了变化(我试图增加 3 小时)。当我用我的代码运行我的测试时,时间根本没有改变......?

我在命令行上做的是:

date "$((10800 + $(date +%s)))"

我怀疑我需要在 Runtime.exec 中添加“adb shell”部分...

似乎这是在正确的道路上,但仍然无法使其运行。它也可能与尼克指出的那样,它需要一个系统进程才能改变时间......?

【问题讨论】:

    标签: android unit-testing


    【解决方案1】:

    如果您需要更改时区,请将 android.permission.SET_TIME_ZONE 添加到您的清单中,

    然后从您的活动中(或您需要的任何地方..但您需要获取适当的上下文..)

    Context context = getContext(); // or (Context) this, or whatever depending on where you are
    AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    mgr.setTimeZone(timezoneid); // replace timezoneid with the time zone you need e.g. "pacific/Auckland"
    mgr.setTime(timeinmillis); // replace timeinmillis with the time you need in millis, probably from a Date or Calendar object... but watch the timezone in the calendar ;-)
    

    关键是AlarmManager系统服务包含设置系统时间和时区的成员..

    【讨论】:

      【解决方案2】:

      http://developer.android.com/reference/android/Manifest.permission.html#SET_TIME

      我搜索了“android 权限”,然后在权限页面上找到了“时间”这个词。如果您已超过 api 级别 8,我建议您请求该权限。

      更新:基于this 链接,我认为无法从用户空间应用程序设置系统时间。出于测试目的,您可能需要手动更改模拟器上的时间。我发现的唯一其他选择需要构建并签署您自己的 Android 版本。

      【讨论】:

      • 我想我正在阅读一个太旧的论坛主题......看起来是正确的方式,但仍然有问题......将更新问题
      • 谢谢尼克,我在问这个问题之前看到了这个问题,但我仍然没有找到解决问题的方法......
      • 用坏消息更新了我的答案:(对不起。
      • 无需抱歉,至少我不会浪费更多时间寻找我想的答案...看起来这家伙:stackoverflow.com/questions/5184863/… 也没有更多的运气...
      【解决方案3】:

      从您的主机(假设您使用的是 linux)您可以运行:

      $ adb shell date $(date --date='2011-06-11 12:10:10' +%s.0)
      

      主要是if是模拟器。将日期和时间替换为所需的值。 您应该找到一种方法将此更改与您的测试同步,或者您甚至可以使用 Runtime.exec() 从您的测试中运行它。

      【讨论】:

      • 看起来是个好主意......我用我得到的东西编辑了这个问题......但仍然没有工作......
      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 2014-09-30
      相关资源
      最近更新 更多