4

我每天都在 Eclipse 中运行非 Android JUnit 测试。今天我想测试我的一些 Android 库类。哦,痛苦。

我有一个使用 android-maven-plugin 的 Android 库项目。我有源文件src/main/java,我的(新)单元测试在src/test/java. 我的 POM 具有适当的 JUnit 依赖项和 android-maven-plugin 引用。

有时我会UriFile. 有时我有一个现有的 JavaURI实例,该实例是从 a 创建的File,然后我将其转换为Uri. 由于我既不信任 Java 也不信任 Android 的文件和 URI(不要让我开始了解 Java 如何破坏 URI 中的 UNC 路径,或者 Java 如何破坏equals()URI 中的合同),我想创建一个简单的单元测试来创建一个临时文件,Uris从两种不同的方法创建,并确保它们相等。

所以我像以前一样做了一个小的 JUnit 单元测试,并尝试在 Eclipse 中使用Ctrl+F11. Eclipse 询问我这是“Android JUnit 测试”还是“JUnit 测试”。好吧,显然是Android。所以我选择第一个选项并得到:

[2013-03-23 21:37:10 - mylib] ------------------------------
[2013-03-23 21:37:10 - mylib] Android Launch!
[2013-03-23 21:37:10 - mylib] adb is running normally.
[2013-03-23 21:37:10 - mylib] Could not find mylib.apk!

嗯……那不是很成功。所以我删除了运行配置并尝试“JUnit Test”。现在我得到一个不同的对话框,要求我选择我喜欢的启动器,“Android JUnit Test Launcher”或“Eclipse JUnit Test Launcher”。我选择哪个并不重要;我得到:

Class not found com.example.MyUnitTest
java.lang.ClassNotFoundException: com.example.MyUnitTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

我已经阅读了 android-maven-plugin,如果他们只使用 Android jar 中的类但不进行任何 API 调用,我可以在 Eclipse 中本地运行单元测试,这就是我在这里所做的。那我该怎么做呢?

4

3 回答 3

3

一种解决方法是单击工具栏中的“运行方式...”按钮,然后选择“运行配置...”。如果您选择您创建的 JUnit 启动器并转到其“类路径”选项卡,您可以将bin/classes文件夹添加到 JUnit 启动器类路径。现在应该运行。

于 2013-06-16T19:20:23.233 回答
3

不要将Run As - Android JUnit Test其仅用于运行Android 测试项目

使用Run As - JUnit Test时,ClassNotFoundException是由于 ADT 和 Eclipse 内置的 JUnit Test Runner 对项目输出文件夹的不一致。ADT 会生成 .class 下的所有文件bin/classes,而内置的 JUnit Test Runner 会在 .class 下查找 .class 文件target/classes。您在 Eclipse 中的 Android 项目从不使用target/classes,所以它仍然是空的,这就是您得到ClassNotFoundException异常的原因。

AFAIK 无法更改 Eclipse 内置的 JUnit Test Runner 以使用与默认目标/类不同的文件夹。 查看Ricardo 的答案,了解如何添加bin/classes到内置 JUnit Test Runner 的类路径。另请注意,您不能将 Android 项目的默认输出文件夹更改为其他文件夹../bin/classes,因为它会破坏 ADT 构建过程。

肮脏的解决方法(用于解决 ClassNotFoundException)是手动将所有内容复制bin\classestarget\classes,请注意,每次更改源代码时都需要这样做。

mvn test从命令行或通过 Eclipse运行时,这不是问题,因为 Maven 使用target\classes并知道如何正确填充它。请注意,通过使用这种方法,您将无法在 Eclipse 中使用带有漂亮红色/绿色错误栏的 JUnit 窗口。

于 2013-03-27T00:54:50.953 回答
0

一个 android junit 测试应该位于一个单独的模块中,作为 Android Maven 插件示例项目中的设置(例如 morseflash 示例)。这是由于路径设置过载以及需要构建 apk 并将其部署在设备/模拟器上以运行测试。Android junit 测试根本不是单元测试,而是集成测试(或者在这种情况下称为仪器测试)。

于 2013-03-26T23:31:36.790 回答