1

Всякий раз, когда я пытаюсь запустить юнит-тесты для классов в моем приложении модуля, которые зависят от классов из модуля библиотеки, я получаю это:Как запустить модульные тесты с зависимостью от модуля библиотеки Android?

java.lang.NoClassDefFoundError: de/ivu/junittest/DummyData 
    at de.ivu.junittest.app.DummyModel.<init>(DummyModel.java:16) 
    at DummyModelTest.testInstantiation(DummyModelTest.java:7) 
    ... 

В приведенном выше примере, DummyData является частью lib модуля, в то время как DummyModel является частью модуля app. DummyModel имеет член типа DummyData, но экземпляр этого метода в тестовом классе DummyModelTest вызывает вышеупомянутое исключение во время тестирования.

Структура проекта выглядит следующим образом:

JUnitTestProject 
    app [module] 
     src 
      main 
       java 
        de.ivu.junittest.app 
         DummyModel.java 
         ... 
       ... 
      test 
       java 
        de.ivu.junittest.app 
         DummyModelTest.java 
       ... 
    lib [module] 
     src 
      main 
       java 
        de.ivu.junittest 
         DummyData.java 
         ... 
       ... 

build.gradle для app модуля содержит следующее:

apply plugin: 'android' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.1" 

    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

sourceSets { 
    unitTest { 
     java.srcDir file('src/test/java') 
     resources.srcDir file('src/test/res') 
    } 
} 

configurations { 
    unitTestCompile.extendsFrom runtime 
    unitTestRuntime.extendsFrom unitTestCompile 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:+' 
    compile project (':lib') 
    compile fileTree(dir: 'libs', include: ['*.jar', '*.aar']) 

    unitTestCompile files("$project.buildDir/classes/release") 
    unitTestCompile 'junit:junit:4.+' 
    unitTestCompile 'org.robolectric:robolectric:2.+' 
    unitTestCompile 'com.google.android:android:4.+' 
    unitTestCompile project (':lib') 
    unitTestCompile fileTree(dir: 'libs', include: ['*.jar', '*.aar']) 

    instrumentTestCompile 'junit:junit:4.+' 
    instrumentTestCompile 'org.robolectric:robolectric:2.+' 
} 

task unitTest(type:Test, dependsOn: assemble) { 
    testClassesDir = project.sourceSets.unitTest.output.classesDir 
    classpath = project.sourceSets.unitTest.runtimeClasspath 
} 
check.dependsOn unitTest 

И, наконец, источником трех Java-классов, начиная с DummyData:

package de.ivu.junittest; 

import android.util.Log; 

public class DummyData { 
    private int data; 

    public int getData() { 
     return data; 
    } 

    public void setData(int data) { 
     this.data = data; 
    } 
} 

T он DummyModel класс:

package de.ivu.junittest.app; 

import android.util.Log; 

import de.ivu.junittest.DummyData; 

public class DummyModel {  
    private DummyData data = new DummyData(); 

    public void setData(int data) { 
     this.data.setData(data); 
    } 

    public int getData() { 
     return this.data.getData(); 
    } 
} 

И, наконец, DummyModelTest:

import static org.junit.Assert.assertEquals; 
import org.junit.runner.RunWith; 
import org.junit.Test; 

import org.robolectric.RobolectricTestRunner; 

import de.ivu.junittest.app.DummyModel; 

@RunWith(RobolectricTestRunner.class) 
public class DummyModelTest { 
    @Test 
    public void testInstantiation() { 
     DummyModel model = new DummyModel(); 
     model.setData(42); 
     assertEquals(model.getData(), 42); 
    } 
} 

После попытки более десятка различных вещей, любая помощь глубоко признателен.

ответ

1

Хитрость заключается в том, чтобы добавить каталоги других модулей classes в качестве зависимости. Таким образом, вы в конечном итоге с unitTestCompile files вместо unitTestCompile project:

dependencies { 
    ... 
    unitTestCompile files("../lib/classes/release") 
    ... 
} 

Не очень красиво, и не очень интуитивно, но он работает с моей текущей настройки (Gradle 1,10, Build Tools 19.0.1 и Android-Gradle-плагин 0,8) ,

+0

Что делать, если ваша библиотека находится в файле .aar. Вы пробовали это? – mbmc

+1

Я не пробовал файл .aar точно, но вместо этого попытался использовать JAR для библиотек. Я тоже не работал, и скрипты сборки в проекте стали еще более неприятными. – Chris

+0

сделал это произведение ?? – jonney

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