Похоже, что и последние инструменты SDK для Android все равно не поддерживают тестирование приложений, содержащих связанные проекты библиотек.
У меня есть проект со следующей настройкой:
TestLib (проект библиотеки Android) < - TestMain (проект android) < - TestMainTest (проект android unit test)
Я создал все эти проекты в eclipse, а затем использовал android update (test-/lib-)project ...
для создания build.xml
et. и др.
Проблема начинается, как только у вас есть класс в TestMain (InheritAddition.java
в моем примере), который наследуется от класса в TestLib (Addition.java
), и вы хотите ссылаться на этот класс в unit test (InheritAdditionTest.java
).
TestLib
public class Addition {
public int add2(int o1, int o2) {
return o1 + o2;
}
}
TestMain
public class InheritAddition extends Addition {
public int sub(int p1, int p2) {
return p1 - p2;
}
}
TestMainTest
public class InheritAdditionTest extends AndroidTestCase {
public void testSub() {
Assert.assertEquals(2, new InheritAddition().sub(3, 1));
}
}
При построении в командной строке результат следующий:
W/ClassPathPackageInfoSource(14871): Caused by: java.lang.NoClassDefFoundError: org/test/main/InheritAddition W/ClassPathPackageInfoSource(14871): ... 26 more W/ClassPathPackageInfoSource(14871): Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation W/ClassPathPackageInfoSource(14871): at dalvik.system.DexFile.defineClass(Native Method) W/ClassPathPackageInfoSource(14871): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195) W/ClassPathPackageInfoSource(14871): at dalvik.system.DexPathList.findClass(DexPathList.java:315) W/ClassPathPackageInfoSource(14871): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58) W/ClassPathPackageInfoSource(14871): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) W/ClassPathPackageInfoSource(14871): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) W/ClassPathPackageInfoSource(14871): ... 26 more W/dalvikvm(14871): Class resolved by unexpected DEX: Lorg/test/main/InheritAddition;(0x41356250):0x13772e0 ref [Lorg/test/lib/Addition;] Lorg/test/lib/Addition;(0x41356250):0x13ba910
Я нашел некоторое обходное решение, которое работает для eclipse:
Это трюк, но я ищу решение, которое работает с ANT (точнее, я ищу решение, которое работает на обоих одновременно).
Документированный подход (путем изменения build.xml для включения баков из основного проекта в путь класса) здесь не применим, так как примерный проект не использует какие-либо библиотеки (также я считаю, что эта конкретная проблема теперь исправлена с инструментами SDK r16).
Я предполагаю, что решение для переборки состоит в том, чтобы попытаться как-то удалить зависимости TestMainTest
до TestLib
(путем изменения project.properties
), а вместо этого удастся взломать конструкцию script, чтобы поместить эти встроенные банки в путь класса (поэтому замените цель -compile
на то, что изменяет путь класса для javac
). Поскольку у меня есть долгая история, пытаясь не отставать от изменений привязки Android SDK, это не мой любимый вариант, так как он a) довольно сложный и b) требует постоянной модификации build.xml
всякий раз, когда изменяется цепочка инструментов (что вполне часто).
Итак, я ищу идеи о том, как настроить такую настройку без использования кувалды. Возможно, мне не хватает чего-то совершенно очевидного, но для меня этот случай использования довольно стандартный, и мне трудно понять, почему это не поддерживается из коробки.