99

我正在编写一个基于 Android Bitmap 类(称为 AndroindLib)的 Android 库项目,它只包含实用程序类(无活动)。我尝试使用 Android JUnit 对其进行测试,但它一直抱怨找不到 AnroidLib.apk

单元测试 Android 库项目的正确方法是什么?

4

5 回答 5

78

引用文档

“有两种推荐的方法来设置库项目中的代码和资源测试:

  • 您可以设置一个测试项目来检测依赖于库项目的应用程序项目。然后,您可以将测试添加到项目中以获取特定于库的功能。

  • 您可以设置一个依赖于库的标准应用程序项目,并将仪器放入该项目中。这使您可以创建一个独立的项目,其中包含测试/仪器和要测试的代码。”

于 2010-08-30T21:47:34.520 回答
17

在您的测试项目中,只需更改包名称,使其与您的库的包相同。例如,您有一个库,其包为"com.example.lib". 创建一个针对您的库的测试项目。在清单文件中,您将看到package="com.example.lib.test", 和targetPackage="com.example.lib". 只需将包从“com.example.lib.test”更改为“com.example.lib”(保持targetPackage原样)。

此外,请确保该库不是在 Java 构建路径中引用到您的测试项目,而是作为通常的 Android 库:在 Eclipse 中,它必须在选项卡中显示为库Project->Properties->Android,而不是Project->Properties->Java Build Path选项卡中。

然后运行你的测试。

于 2012-12-15T11:41:19.980 回答
5

根据文档

测试库模块与测试应用程序相同。主要区别在于库及其依赖项会自动包含为测试 APK 的依赖项。这意味着测试 APK 不仅包括它自己的代码,还包括库的 AAR 及其所有依赖项。因为没有单独的“正在测试的应用程序”,所以 androidTest 任务仅安装(和卸载)测试 APK。当合并多个 manifest 文件时,Gradle 遵循默认的优先级顺序,将库的 manifest 合并到测试 APK 的主 manifest。

于 2017-01-05T23:49:16.660 回答
1

注意: 此解决方案基于使用 Eclipse Indigo (3.8.2),并且可能必须为另一个 IDE 稍微不同地实现,尽管基本原理是相同的。

我有类似的问题,我发现执行以下操作总是有效的:

注意:这些说明用于从头开始构建一个新的项目组。如果您已经构建了项目组的一部分,那么您可能需要修改您的项目,以便它们以相同的方式连接。

  1. 通过在创建过程中选中“Is Library”复选框来创建一个新的 Android Library 项目。(例如一个名为“RemingtonAndroidTools”的 Android 项目)。
  2. 构建 Android 库项目并验证它是否在 bin 文件夹中创建了一个 jar 文件。(例如一个名为“RemingtonAndroidTools.jar”的 jar 文件。)
  3. 创建一个空的 Android 项目来测试将用作 Android 测试应用程序的 Android 应用程序。(例如一个名为“RemingtonAndroidToolsTestApp”的 Android 项目)。您无需修改​​ Android Test App 项目的源代码或资源,除非您有一些必须添加以进行测试的内容。无需对 Android 测试应用项目进行任何修改即可测试许多内容。 Android Test App 项目是您的 Android Library 项目和 Android Junit 项目之间的桥梁,它使通过 Android Junit 测试 Android Library 项目成为可能。
  4. 转到 Android Test App 项目的 Java Build Path 的 Library 选项卡(本例中为“RemingtonAndroidToolsTestApp”)。
  5. 通过“Add Jars...”按钮添加 Android 库项目(在本例中为“RemingtonAndroidTools”)的 jar 文件(在本例中为“RemingtonAndroidTools.jar”)。
  6. 创建一个新的 Android 测试项目(例如“RemingtonAndroidToolsTester”),该项目将用作 Android 库测试器,并选择 Android 测试应用项目(本例中的“RemingtonAndroidToolsTestApp”)作为目标。
  7. 转到 Android Library Tester 项目(本例中为“RemingtonAndroidToolsTester”)的 Java Build Path 的 Library 选项卡。
  8. 通过“Add Jars...”按钮添加 Android 库项目(在本例中为“RemingtonAndroidTools”)的 jar 文件(在本例中为“RemingtonAndroidTools.jar”)。
  9. 在 Android Library Tester 项目中找到您的 Android 包的最后一个文件夹(例如“danny.remington.remington_android_tools_test_app.test”)并添加一个继承自 ActivityInstrumentationTestCase2 的测试类(例如“MainActivityTest”)。
  10. 编辑测试类(本例中为“TestActivityTest”)以使用 Android 测试应用(本例中为“RemingtonAndroidToolsTestApp”)的活动(例如“TestActivity”)作为 ActivityInstrumentationTestCase2 的参数。
  11. 编辑测试类(本例中为“TestActivityTest”)并创建一个默认构造函数,该构造函数调用 super(Class) 并传入 Android 测试应用程序的类(例如“TestActivity.class”)。

您最终应该会得到三个看起来与此类似的项目(Android 库、Android 测试应用程序、Android 库测试器):

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

您应该最终得到一个用于测试您的 Android 库的类,它看起来类似于以下内容:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

然后,您可以添加任何您想要的测试。您无需进一步引用 Android 测试应用程序(本例中为“RemingtonAndroidToolsTestApp”)来运行您的测试,除非它们需要访问 Android 特定组件(例如 Assets 文件夹)。如果您需要访问任何 Android 特定组件,您可以通过修改 Android 测试应用程序(本例中为“RemingtonAndroidToolsTestApp”)然后通过标准 Android Junit API 提供的工具引用它来实现。(您可以在这里阅读更多相关信息:http: //developer.android.com/tools/testing/testing_android.html

于 2013-05-16T18:28:51.323 回答
0

如果你的 ulitiy 类不依赖于任何 android 特定的代码,你可以使用标准的 JUnit 单元测试。无需使用安卓版本。

于 2010-08-30T20:06:04.767 回答