如何单元测试android.graphics.Bitmap和BitmapFactory?

时间:2016-07-28 13:43:52

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

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

我尝试了两个选项:

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

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

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

2 个答案:

答案 0 :(得分:1)

我最终做了什么:

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

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

  3. 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()
    
    }
    

答案 1 :(得分:0)

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

因此,您需要使用一些缓存机制正确管理位图。

对于测试,您可以在Android studio中使用监视器服务和内存部分。