Модульное тестирование Android с использованием муравья с проектом библиотеки

Кажется, что также последние инструменты SDK для Android по-прежнему не поддерживают должным образом тестирование приложений, содержащих проекты связанных библиотек.

У меня есть проект с следующая настройка:

TestLib (проект библиотеки Android)

Я создал все эти проекты в eclipse, а затем использовал обновление Android (test- / lib-) проект ... для создания build.xml и др.

Проблема начинается, как только у вас есть класс в TestMain ( InheritAddition.java в моем примере), который наследуется от класса в TestLib ( Addition.java ), и вы хотите ссылаться на этот класс в модульном тесте ( 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:

Не могу построить и запустить тестовый проект Android, созданный с помощью команды «ant create test-project», когда тестируемый проект имеет jar-файлы в каталоге libs

. Это помогает, но я ищу решение, которое работает с ANT (точнее, я ищу решение, которое работает на обоих одновременно).

Документированный подход (путем изменения build.xml для включения jar-файлов из основного проекта в путь к классам) здесь не применяется, поскольку в примере проекта не используются никакие библиотечные jar-файлы (также я считаю, что эта конкретная проблема теперь решена с помощью инструментов SDK r16).

Я предполагаю, что метод грубой силы - попытаться каким-то образом удалить зависимости TestMainTest от TestLib (путем изменения project.properties ) и вместо этого удастся взломать сценарий сборки, чтобы поместить эти созданные jar-файлы в путь к классам (поэтому замените цель -compile чем-то, что изменяет путь к классам для javac ). Поскольку у меня есть долгая история попыток не отставать от изменений в цепочке инструментов Android SDK, это не совсем мой любимый вариант, поскольку он а) довольно сложен и б) требует постоянной модификации build.xml всякий раз, когда смены инструментария (что случается довольно часто).

Итак, я ищу идеи, как заставить такую ​​установку работать без использования кувалды. Возможно, мне не хватает чего-то совершенно очевидного, но для меня этот вариант использования довольно стандартный, и мне трудно понять, почему он не поддерживается из коробки.

21
задан Community 23 May 2017 в 12:23
поделиться