Кажется, что также последние инструменты SDK для Android по-прежнему не поддерживают должным образом тестирование приложений, содержащих проекты связанных библиотек.
У меня есть проект с следующая настройка:
TestLib (проект библиотеки Android)
Я создал все эти проекты в eclipse, а затем использовал обновление Android (test- / lib-) проект ...
для создания build.xml
и др.
Проблема начинается, как только у вас есть класс в 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): 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 для включения jar-файлов из основного проекта в путь к классам) здесь не применяется, поскольку в примере проекта не используются никакие библиотечные jar-файлы (также я считаю, что эта конкретная проблема теперь решена с помощью инструментов SDK r16).
Я предполагаю, что метод грубой силы - попытаться каким-то образом удалить зависимости TestMainTest
от TestLib
(путем изменения project.properties
) и вместо этого удастся взломать сценарий сборки, чтобы поместить эти созданные jar-файлы в путь к классам (поэтому замените цель -compile
чем-то, что изменяет путь к классам для javac
). Поскольку у меня есть долгая история попыток не отставать от изменений в цепочке инструментов Android SDK, это не совсем мой любимый вариант, поскольку он а) довольно сложен и б) требует постоянной модификации build.xml
всякий раз, когда смены инструментария (что случается довольно часто).
Итак, я ищу идеи, как заставить такую установку работать без использования кувалды. Возможно, мне не хватает чего-то совершенно очевидного, но для меня этот вариант использования довольно стандартный, и мне трудно понять, почему он не поддерживается из коробки.