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) 
    ... 

在上面的示例,DummyDatalib模塊的一部分,而DummyModelapp模塊的一部分。 DummyModelDummyData類型的成員,但在測試類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.gradleapp模塊包含以下:

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") 
    ... 
} 

不是很美觀,也很直觀,但它與我目前的設置工作(1.10搖籃,構建工具19.0.1和Android的搖籃 - 插件0.8) 。

+0

如果您的庫位於.aar文件中,該怎麼辦?你嘗試過嗎? – mbmc

+1

我沒有準確地嘗試.aar文件,而是嘗試爲庫使用JAR。我也沒有工作,項目中的構建腳本變得更加糟糕。 – Chris

+0

做了這項工作? – jonney

相關問題