【问题标题】:How to unit test android.graphics.Bitmap and BitmapFactory?如何对 android.graphics.Bitmap 和 BitmapFactory 进行单元测试?
【发布时间】:2016-07-28 13:43:52
【问题描述】:

我正在开发一个成像应用程序。 我想为 Bitmap 相关功能实现单元测试。 我还需要查看输出位图。

我尝试了两种选择:

  1. test/java 中运行测试,这样我就可以将输出图像转储到我的 Mac 上的一个文件中并手动打开它。但我收到了android.graphics.BitmapFactory not mocked

  2. androidTest/java 中运行测试,因此 BitmapFactory 已完全实现,但是:

    • 我在尝试使用adb pull 使用mockContext.openFileOutput(fileName, Context.MODE_PRIVATE) 拉取文件时得到access denied
    • 我无法写入外部目录,因为没有使用 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 的 Activity 我无法授予写入权限(编辑:我错了,您可以使用 adb 实用程序授予 READ 和 WRITE 存储空间)
    • 如果我让它工作,我不知道如何挂钩到 gradle 任务以自动执行拉取命令/或在运行时获得大写访问权限。

那么如何测试Bitmap相关的代码呢?我没有选择!

【问题讨论】:

  • 单元测试应用程序具有与其正在测试的应用程序相同的权限。单元测试应该可以从私有存储中获取照片并将其移动到公共存储中。甚至可以将其传输到文件服务器。

标签: android unit-testing android-gradle-plugin android-permissions android-bitmap


【解决方案1】:

我最终做了什么:

  1. 创建两个我可以在测试前后手动调用的 Gradle 任务。

    • imagingBeforeTest 正在授予访问存储和清理目录的权限
    • imagingAfterTest 正在将设备上目录的内容拉到本地构建目录,以便您以后进行探索。
  2. 创建一个常量,指向我在 Gradle 任务中定义的同一目录。

Java 常量:

public static final File ANDROID_TEST_DIR = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "mypackage");

Gradle 文件:

def androidPlugin = project.plugins.findPlugin("android")
def adb = androidPlugin.sdkHandler.sdkInfo?.adb
def mypackageDir = '/storage/emulated/0/Download/mypackage'

//Grant necessary permissions and create storage dir
task imagingBeforeTest(type: Exec) {
    commandLine "$adb", 'shell', 'pm', 'grant', 'fr.mycompany.mypackage', 'android.permission.READ_EXTERNAL_STORAGE'
    commandLine "$adb", 'shell', 'pm', 'grant', 'fr.mycompany.mypackage', 'android.permission.WRITE_EXTERNAL_STORAGE'
    commandLine "$adb", 'shell', 'rm', '-r', "$mypackageDir"
    commandLine "$adb", 'shell', 'mkdir', "$mypackageDir"
}

//Pull content of storage dir to the local build directory
task imagingAfterTest(type: Exec) {
    // Alias is /storage/self/primary/Download/mypackage
    File testDir = new File(rootProject.buildDir.absoluteFile, "/pulledTest")
    testDir.mkdir()
    commandLine "$adb", 'pull', "$mypackageDir", testDir.getAbsolutePath()

}

【讨论】:

    【解决方案2】:

    对于位图相关的应用程序,主要需要管理的是设备的内存消耗。

    所以你需要通过一些缓存机制来正确管理位图。

    对于测试,您可以在 Android Studio 中将 Monitors 服务与 Memory 部分一起使用。

    【讨论】:

    • 听不懂你的回答
    • 你想用正确的设备测试你的位图实现吗?
    • 不,我想测试涉及 android.graphics.Bitmap 的复杂操作
    猜你喜欢
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2019-01-05
    • 2011-03-16
    • 2013-01-02
    相关资源
    最近更新 更多