似乎最新的 android SDK 工具仍然不能正确支持包含链接库项目的应用程序的测试。
我有一个具有以下设置的项目:
TestLib (android 库项目) <- TestMain (android 项目) <- TestMainTest (android 单元测试项目)
我在 Eclipse 中创建了所有这些项目,然后用于android update (test-/lib-)project ...
生成build.xml
et。人。
一旦您在 TestMain (InheritAddition.java
在我的示例中)中有一个继承自 TestLib ( Addition.java
) 中的类并且您想在单元测试 ( InheritAdditionTest.java
) 中引用该类时,问题就开始了。
测试库
public class Addition {
public int add2(int o1, int o2) {
return o1 + o2;
}
}
测试主程序
public class InheritAddition extends Addition {
public int sub(int p1, int p2) {
return p1 - p2;
}
}
测试主测试
public class InheritAdditionTest extends AndroidTestCase {
public void testSub() {
Assert.assertEquals(2, new InheritAddition().sub(3, 1));
}
}
在命令行上构建时,结果如下:
W/ClassPathPackageInfoSource(14871):引起:java.lang.NoClassDefFoundError:org/test/main/InheritAddition W/ClassPathPackageInfoSource(14871): ... 26 更多 W/ClassPathPackageInfoSource(14871):引起:java.lang.IllegalAccessError:预验证类中的类引用解析为意外实现 W/ClassPathPackageInfoSource(14871):在 dalvik.system.DexFile.defineClass(Native Method) W/ClassPathPackageInfoSource(14871):在 dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195) W/ClassPathPackageInfoSource(14871):在 dalvik.system.DexPathList.findClass(DexPathList.java:315) W/ClassPathPackageInfoSource(14871):在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58) W/ClassPathPackageInfoSource(14871):在 java.lang.ClassLoader.loadClass(ClassLoader.java:501) W/ClassPathPackageInfoSource(14871):在 java.lang.ClassLoader.loadClass(ClassLoader.java:461) W/ClassPathPackageInfoSource(14871): ... 26 更多 W/dalvikvm(14871):由意外 DEX 解析的类:Lorg/test/main/InheritAddition;(0x41356250):0x13772e0 ref [Lorg/test/lib/Addition;] Lorg/test/lib/Addition;(0x41356250):0x13ba910
我找到了一些适用于 eclipse 的解决方法:
当测试项目在 libs 目录中有 jar 时,无法构建和运行使用“ant create test-project”创建的 android 测试项目
这就是诀窍,但我正在寻找一种适用于 ANT 的解决方案(更准确地说,我正在寻找一种同时适用于两者的解决方案)。
记录的方法(通过更改 build.xml 以将主项目中的 jar 包含到类路径中)在此处不适用,因为示例项目不使用任何库 jar(我也相信这个特殊问题现在已通过 SDK 工具修复r16)。
我想解决这个问题的蛮力方法是尝试以某种方式删除 to 的依赖项TestMainTest
(TestLib
通过修改project.properties
),而是设法破解构建脚本以将那些构建的 jar 放入类路径(所以用-compile
修改的东西替换目标的类路径javac
)。由于我长期以来一直试图跟上 android SDK 工具链的变化,因此这并不是我最喜欢的选择,因为它 a) 相当复杂,b)build.xml
每当工具链发生变化时(这种情况非常频繁),都需要不断地修改。
所以我正在寻找如何在不使用大锤的情况下让这样的设置工作的想法。也许我遗漏了一些非常明显的东西,但对我来说这个用例是相当标准的,我很难理解为什么不支持开箱即用。