2015-04-28 2 views
2

Я пытаюсь проверить библиотеку андроидов со следующей настройкой. com.android.tools.build:gradle:1.2.0, org.robolectric:robolectric:3.0-rc2, android studio 1.2-rc-3 В настройке моего теста я косвенно ссылаюсь на файл R другой библиотеки. Тест отлично работает в студии android, но из командной строки появляется следующая ошибка.

java.lang.NoClassDefFoundError: robolectricdemo/com/baselibrary/R$color 
      at robolectricdemo.com.baselibrary.DemoStaticClass.getDemoResource(DemoStaticClass.java:12) 
      at LibraryResourceTest.setUp(LibraryResourceTest.java:25) 

      Caused by: 
      java.lang.ClassNotFoundException: robolectricdemo.com.baselibrary.R$color 
       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:425) 
       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
       at org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:98) 
       ... 2 more 

Я создал упрощенную версию моего кода на http://github.com/tcw48/robolectricDemo с важными сниппеты ржали.

Класс тест живет в библиотеке extendlibrary

RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class LibraryResourceTest { 
    private int color; 

    @Before 
    public void setUp() { 
     color = DemoStaticClass.getDemoResource(RuntimeEnvironment.application); 
    } 

    @Test 
    public void testLibraryResource(){ 
     assertNotNull(color); 
    } 
} 

Этот статический класс живет в библиотеке baselibrary.

public class DemoStaticClass { 

    public static int getDemoResource(Context context) { 
     return context.getResources().getColor(R.color.robo_red); 
    } 
} 

Я заметил в каталоге сборки, что файл R только генерируется в пакете extendlibrary но нет пакета для baselibrary. Вручную создание R-файла в пакете, называемом baselibrary, заставляет тест проходить. Любые идеи о том, что я могу делать неправильно.

+0

Перед тем, как кто-нибудь прочитает ваш код, какая версия Robolectric? Почему бы просто не использовать их образцы здесь, эта работа: https://github.com/robolectric/robolectric-samples? Почему вы не опубликовали какие-либо фрагменты кода? Приложение работает нормально? –

+0

Добавит запрошенную информацию. Я не использую образцы, потому что они не применяются к тому, что я пытаюсь проверить. – TravisW

+0

Какое точное испытание вам нужно? –

ответ

0

Класс R отсутствует, пока вы не предоставите его;) Попробуйте, если он сработает для вас, когда вы скопируете действительный класс R в ожидаемый пакет.

Вы должны изменить пути в задаче копирования в соответствии с вашими именами пакетов

afterEvaluate { project -> 
    android.libraryVariants.each { variant -> 
    // workaround for missing R class for aar dependencies 
    tasks.getByName("assemble${variant.name.capitalize()}").dependsOn copyAppcompat 

    // workaround for missing compilation of main sources 
    tasks.getByName("test${variant.name.capitalize()}") { 
     dependsOn "assemble${variant.name.capitalize()}" 
    } 
    } 
} 

task copyAppcompat(type: Copy) { 
    from 'build/generated/source/r/debug/com/example/core' 
    into 'src/test/java/android/support/v7/appcompat' 
    include 'R.java' 
    filter { line -> line.contains('package com.example.core;') ? 'package android.support.v7.appcompat;' : line } 
} 

Вот пример проекта, который зависит от других библиотек (AAR) https://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar

А вот пример build.gradlehttps://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar/core/build.gradle#L42

+0

Да, я закончил тем, что делал что-то в этом направлении, однако немного разочаровался в том, что robolectric не смог забрать это из коробки. – TravisW

+0

Я изменил цель на 'в 'src/test/java/android/support/v7/appcompat'', потому что в зависимости от библиотеки модуль приложения не любит дополнительный класс R в основных источниках. – nenick

Смежные вопросы