2010-03-18 10 views
28

Ho un modulo che crea un'applicazione chiamata MyApp. Ne ho un altro che costruisce alcuni test per quell'app, chiamato MyAppTests. Entrambi costruiscono i propri APK e funzionano entrambi bene all'interno del mio IDE. Mi piacerebbe costruirli usando la formica in modo da poter sfruttare l'integrazione continua.Impossibile creare ed eseguire un progetto di prova Android creato utilizzando "ant create test-project" quando il progetto testato ha jar nella directory libs

Costruire il modulo dell'app funziona correttamente. Sto avendo difficoltà a compilare ed eseguire il modulo Test.

Utilizzando il suggerimento di Christopher da previous question, ho utilizzato android create test-project -p MyAppTests -m ../MyApp -n MyAppTests per creare i file di build necessari per creare ed eseguire il mio progetto di test. Questo sembra funzionare alla grande (una volta rimosso un caso di test non necessario che ha costruito per me e ripristinato il mio AndroidManifest.xml su quello che stavo usando prima che venisse sostituito da android create), ma ho due problemi.

Il primo problema: il progetto non viene compilato perché mancano le librerie.

$ ant run-tests 
Buildfile: build.xml 
    [setup] Project Target: Google APIs 
    [setup] Vendor: Google Inc. 
    [setup] Platform Version: 1.6 
    [setup] API level: 4 
    [setup] WARNING: No minSdkVersion value set. Application will install on all Android versions. 

-install-tested-project: 
    [setup] Project Target: Google APIs 
    [setup] Vendor: Google Inc. 
    [setup] Platform Version: 1.6 
    [setup] API level: 4 
    [setup] WARNING: No minSdkVersion value set. Application will install on all Android versions. 

-compile-tested-if-test: 

-dirs: 
    [echo] Creating output directories if needed... 

-resource-src: 
    [echo] Generating R.java/Manifest.java from the resources... 

-aidl: 
    [echo] Compiling aidl files into Java classes... 

compile: 
    [javac] Compiling 1 source file to /Users/mike/Projects/myapp/android/MyApp/bin/classes 

-dex: 
    [echo] Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyApp/bin/classes.dex... 
    [echo]   

-package-resources: 
    [echo] Packaging resources 
[aaptexec] Creating full resource package... 

-package-debug-sign: 
[apkbuilder] Creating MyApp-debug-unaligned.apk and signing it with a debug key... 
[apkbuilder] Using keystore: /Users/mike/.android/debug.keystore 

debug: 
    [echo] Running zip align on final apk... 
    [echo] Debug Package: /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk 

install: 
    [echo] Installing /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk onto default emulator or device... 
    [exec] 1567 KB/s (288354 bytes in 0.179s) 
    [exec]  pkg: /data/local/tmp/MyApp-debug.apk 
    [exec] Success 

-compile-tested-if-test: 

-dirs: 
    [echo] Creating output directories if needed... 
    [mkdir] Created dir: /Users/mike/Projects/myapp/android/MyAppTests/gen 
    [mkdir] Created dir: /Users/mike/Projects/myapp/android/MyAppTests/bin 
    [mkdir] Created dir: /Users/mike/Projects/myapp/android/MyAppTests/bin/classes 

-resource-src: 
    [echo] Generating R.java/Manifest.java from the resources... 

-aidl: 
    [echo] Compiling aidl files into Java classes... 

compile: 
    [javac] Compiling 5 source files to /Users/mike/Projects/myapp/android/MyAppTests/bin/classes 
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:4: package roboguice.test does not exist 
    [javac] import roboguice.test.RoboUnitTestCase; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:8: package com.google.gson does not exist 
    [javac] import com.google.gson.JsonElement; 
    [javac]      ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:9: package com.google.gson does not exist 
    [javac] import com.google.gson.JsonParser; 
    [javac]      ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:11: cannot find symbol 
    [javac] symbol: class RoboUnitTestCase 
    [javac] public class GsonTest extends RoboUnitTestCase<MyApplication> { 
    [javac]        ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:6: package roboguice.test does not exist 
    [javac] import roboguice.test.RoboUnitTestCase; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:7: package roboguice.util does not exist 
    [javac] import roboguice.util.RoboLooperThread; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:11: package com.google.gson does not exist 
    [javac] import com.google.gson.JsonObject; 
    [javac]      ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:15: cannot find symbol 
    [javac] symbol: class RoboUnitTestCase 
    [javac] public class HttpTest extends RoboUnitTestCase<MyApplication> { 
    [javac]        ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:4: package roboguice.test does not exist 
    [javac] import roboguice.test.RoboUnitTestCase; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:12: cannot find symbol 
    [javac] symbol: class RoboUnitTestCase 
    [javac] public class LinksTest extends RoboUnitTestCase<MyApplication> { 
    [javac]        ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:4: package roboguice.test does not exist 
    [javac] import roboguice.test.RoboUnitTestCase; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:5: package roboguice.util does not exist 
    [javac] import roboguice.util.RoboAsyncTask; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:6: package roboguice.util does not exist 
    [javac] import roboguice.util.RoboLooperThread; 
    [javac]     ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:12: cannot find symbol 
    [javac] symbol: class RoboUnitTestCase 
    [javac] public class SafeAsyncTest extends RoboUnitTestCase<MyApplication> { 
    [javac]         ^
    [javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectResource': class file for roboguice.inject.InjectResource not found 
    [javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectResource' 
    [javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView': class file for roboguice.inject.InjectView not found 
    [javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView' 
    [javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView' 
    [javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView' 
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:15: cannot find symbol 
    [javac] symbol : class JsonParser 
    [javac] location: class com.myapp.test.GsonTest 
    [javac]   final JsonParser parser = new JsonParser(); 
    [javac]    ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:15: cannot find symbol 
    [javac] symbol : class JsonParser 
    [javac] location: class com.myapp.test.GsonTest 
    [javac]   final JsonParser parser = new JsonParser(); 
    [javac]          ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:18: cannot find symbol 
    [javac] symbol : class JsonElement 
    [javac] location: class com.myapp.test.GsonTest 
    [javac]   final JsonElement e = parser.parse(s); 
    [javac]    ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:20: cannot find symbol 
    [javac] symbol : class JsonElement 
    [javac] location: class com.myapp.test.GsonTest 
    [javac]   final JsonElement e2 = parser.parse(s2); 
    [javac]    ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:19: cannot find symbol 
    [javac] symbol : method getInstrumentation() 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   assertEquals("MyApp", getInstrumentation().getTargetContext().getResources().getString(com.myapp.R.string.app_name)); 
    [javac]       ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:62: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:82: cannot find symbol 
    [javac] symbol : method assertTrue(java.lang.String,boolean) 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   assertTrue(result[0], result[0].contains("Search")); 
    [javac]  ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:87: cannot find symbol 
    [javac] symbol : class JsonObject 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   final JsonObject[] result = {null}; 
    [javac]    ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:90: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:117: cannot find symbol 
    [javac] symbol : class JsonObject 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   final JsonObject[] result = {null}; 
    [javac]    ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:120: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.HttpTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:27: cannot find symbol 
    [javac] symbol : method assertTrue(boolean) 
    [javac] location: class com.myapp.test.LinksTest 
    [javac]    assertTrue(m.matches()); 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:28: cannot find symbol 
    [javac] symbol : method assertEquals(java.lang.String,java.lang.String) 
    [javac] location: class com.myapp.test.LinksTest 
    [javac]    assertEquals(map.get(url), m.group(1)); 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:19: cannot find symbol 
    [javac] symbol : method getInstrumentation() 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   assertEquals("MyApp", getInstrumentation().getTargetContext().getString(com.myapp.R.string.app_name)); 
    [javac]       ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:27: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:65: cannot find symbol 
    [javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State) 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   assertEquals(State.TEST_SUCCESS,state[0]); 
    [javac]  ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:74: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:105: cannot find symbol 
    [javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State) 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   assertEquals(State.TEST_SUCCESS,state[0]); 
    [javac]  ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:113: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:144: cannot find symbol 
    [javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State) 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   assertEquals(State.TEST_SUCCESS,state[0]); 
    [javac]  ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:154: cannot find symbol 
    [javac] symbol : class RoboLooperThread 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   new RoboLooperThread() { 
    [javac]   ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:187: cannot find symbol 
    [javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State) 
    [javac] location: class com.myapp.test.SafeAsyncTest 
    [javac]   assertEquals(State.TEST_SUCCESS,state[0]); 
    [javac]  ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.java:11: cannot access roboguice.activity.GuiceListActivity 
    [javac] class file for roboguice.activity.GuiceListActivity not found 
    [javac] public class StoriesTest extends ActivityUnitTestCase<Stories> { 
    [javac]             ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.java:21: cannot access roboguice.application.GuiceApplication 
    [javac] class file for roboguice.application.GuiceApplication not found 
    [javac]   setApplication(new MyApplication(getInstrumentation().getTargetContext())); 
    [javac]      ^
    [javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.java:22: incompatible types 
    [javac] found : com.myapp.activity.Stories 
    [javac] required: android.app.Activity 
    [javac]   final Activity activity = startActivity(intent, null, null); 
    [javac]            ^
    [javac] 39 errors 
    [javac] 6 warnings 

BUILD FAILED 
/opt/local/android-sdk-mac/platforms/android-1.6/templates/android_rules.xml:248: Compile failed; see the compiler error output for details. 

Total time: 24 seconds 

Questo non è un problema difficile da risolvere. Non sono sicuro che sia la cosa giusta da fare, ma ho copiato le librerie mancanti (roboguice e gson) dalla directory MyApp/libs alla directory MyAppTests/libs e tutto sembra compilare bene.

Ma questo porta al secondo problema, al quale sono attualmente bloccato. I test compilare bene ma non verrà eseguito:

$ cp ../MyApp/libs/gson-r538.jar libs/ 

$ cp ../MyApp/libs/roboguice-1.1-SNAPSHOT.jar libs/ 

0 10:23 /Users/mike/Projects/myapp/android/MyAppTests $ ant run-testsBuildfile: build.xml 
    [setup] Project Target: Google APIs 
    [setup] Vendor: Google Inc. 
    [setup] Platform Version: 1.6 
    [setup] API level: 4 
    [setup] WARNING: No minSdkVersion value set. Application will install on all Android versions. 

-install-tested-project: 
    [setup] Project Target: Google APIs 
    [setup] Vendor: Google Inc. 
    [setup] Platform Version: 1.6 
    [setup] API level: 4 
    [setup] WARNING: No minSdkVersion value set. Application will install on all Android versions. 

-compile-tested-if-test: 

-dirs: 
    [echo] Creating output directories if needed... 

-resource-src: 
    [echo] Generating R.java/Manifest.java from the resources... 

-aidl: 
    [echo] Compiling aidl files into Java classes... 

compile: 
    [javac] Compiling 1 source file to /Users/mike/Projects/myapp/android/MyApp/bin/classes 

-dex: 
    [echo] Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyApp/bin/classes.dex... 
    [echo]   

-package-resources: 
    [echo] Packaging resources 
[aaptexec] Creating full resource package... 

-package-debug-sign: 
[apkbuilder] Creating MyApp-debug-unaligned.apk and signing it with a debug key... 
[apkbuilder] Using keystore: /Users/mike/.android/debug.keystore 

debug: 
    [echo] Running zip align on final apk... 
    [echo] Debug Package: /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk 

install: 
    [echo] Installing /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk onto default emulator or device... 
    [exec] 1396 KB/s (288354 bytes in 0.201s) 
    [exec]  pkg: /data/local/tmp/MyApp-debug.apk 
    [exec] Success 

-compile-tested-if-test: 

-dirs: 
    [echo] Creating output directories if needed... 

-resource-src: 
    [echo] Generating R.java/Manifest.java from the resources... 

-aidl: 
    [echo] Compiling aidl files into Java classes... 

compile: 
    [javac] Compiling 5 source files to /Users/mike/Projects/myapp/android/MyAppTests/bin/classes 
    [javac] Note: /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java uses unchecked or unsafe operations. 
    [javac] Note: Recompile with -Xlint:unchecked for details. 

-dex: 
    [echo] Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyAppTests/bin/classes.dex... 
    [echo]   

-package-resources: 
    [echo] Packaging resources 
[aaptexec] Creating full resource package... 

-package-debug-sign: 
[apkbuilder] Creating MyAppTests-debug-unaligned.apk and signing it with a debug key... 
[apkbuilder] Using keystore: /Users/mike/.android/debug.keystore 

debug: 
    [echo] Running zip align on final apk... 
    [echo] Debug Package: /Users/mike/Projects/myapp/android/MyAppTests/bin/MyAppTests-debug.apk 

install: 
    [echo] Installing /Users/mike/Projects/myapp/android/MyAppTests/bin/MyAppTests-debug.apk onto default emulator or device... 
    [exec] 1227 KB/s (94595 bytes in 0.075s) 
    [exec]  pkg: /data/local/tmp/MyAppTests-debug.apk 
    [exec] Success 

run-tests: 
    [echo] Running tests ... 
    [exec] 
    [exec] android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests:INSTRUMENTATION_RESULT: shortMsg=Class ref in pre-verified class resolved to unexpected implementation 
    [exec] INSTRUMENTATION_RESULT: longMsg=java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 
    [exec] INSTRUMENTATION_CODE: 0 

BUILD SUCCESSFUL 
Total time: 38 seconds 

Qualche idea di cosa sta causando il "ref classe in classe pre-verificata deliberato la realizzazione inaspettato" errore?

risposta

13

Il problema è che c'è un bug negli script di build di ant android che non includono la directory libs del progetto testato durante la compilazione del progetto tester. Se cerchi di aggirare questo problema copiando le librerie libs nella directory libs del progetto tester, ti imbatterai in problemi di verifica della classe in fase di esecuzione come ho fatto io, come sottolineato da Fadden.

La soluzione è quella di modificare il target compile originariamente in Android di android_test_rules.xml aggiungere <fileset dir="${tested.project.absolute.dir}/libs" includes="*.jar" /> alla direttiva <classpath>.

Ecco il target modificato compile.Aggiungendo al build.xml nel progetto TESTER, si avrà la precedenza su quella in android_test_rules.xml:

<!-- override "compile" target in platform android_rules.xml to include tested app's external libraries --> 
<target name="compile" depends="-resource-src, -aidl" 
      description="Compiles project's .java files into .class files"> 
    <!-- If android rules are used for a test project, its classpath should include 
     tested project's location --> 
    <condition property="extensible.classpath" 
         value="${tested.project.absolute.dir}/bin/classes" else="."> 
     <isset property="tested.project.absolute.dir" /> 
    </condition> 
    <javac encoding="ascii" target="1.5" debug="true" extdirs="" 
      destdir="${out.classes.absolute.dir}" 
      bootclasspathref="android.target.classpath" 
      verbose="${verbose}" classpath="${extensible.classpath}"> 
     <src path="${source.absolute.dir}" /> 
     <src path="${gen.absolute.dir}" /> 
     <classpath> 
      <fileset dir="${tested.project.absolute.dir}/libs" includes="*.jar" /> 
      <fileset dir="${external.libs.absolute.dir}" includes="*.jar" /> 
     </classpath> 
    </javac> 
</target> 
+0

Sembra che questa sia la soluzione, ma quando si aggiungono quelle linee al mio build.xml, la formica si lamenta che -resource-src e -aidl non sono definiti (sebbene siano importati): Target "-resource-src" non esiste nel progetto "sdk_android_test". È usato dall'obiettivo "compilare". – Snicolas

+0

Ok, ho avuto la versione sbagliata degli strumenti. Se ricevi lo stesso errore che ho ricevuto, prendi la nuova versione di compile in ou strumento android ant_rules * .xml file. – Snicolas

+1

se posso chiedere, quale versione di sdk stai usando? Sto usando r16 e ancora ottenendo il "Target" -resource-src "non esiste nel progetto" – browep

6

Non vedo l'effettivo messaggio di errore nel testo sopra, ma penso di poter rispondere.

In genere, l'avviso si verifica perché lo stesso codice viene visualizzato in due APK diversi. L'implementazione in un APK è stata utilizzata per la pre-verifica e l'ottimizzazione, ma l'altra implementazione viene utilizzata durante l'esecuzione. La VM rileva la situazione e rifiuta la classe, poiché la verifica e l'ottimizzazione sono state eseguite con un insieme di ipotesi che non sono più valide.

Il modo per risolvere questo problema è garantire che sia disponibile una sola implementazione di una classe per la VM. Ciò potrebbe richiedere un po 'di più la lotta con gli script di compilazione.

È possibile visualizzare il contenuto di un APK con "dexdump". (C'è anche "dexlist", che è un po 'più conciso, ma non ricordo se è parte dell'SDK.)

+1

Sì, stavo pensando che il problema potrebbe essere quello basato su alcune altre cose che ho trovato su Google, ma non sono stato in grado di capire come evitarlo ancora. BTW l'errore si presenta nella parte inferiore del secondo blocco di codice durante l'obiettivo "run-tests" – emmby

0

Hai provato a includere i file .class nell'apk di test, invece di generare nuovi . Class file dal tuo progetto originale? Questo ha risolto il problema nel mio caso.

+0

Ciao seelengut, puoi chiarire? Non sono sicuro di capire. – emmby

19

Se si utilizza Eclipse, un approccio più semplice è quello di non includere la libreria esterna nel test progetto, ma piuttosto esportarlo nelle impostazioni di Eclipse Project. Questo risolverà il problema

enter image description here

Tempo fa, ho scritto un post sul blog che spiega questo: http://juristr.com/blog/2010/06/android-instrumentation-test/

+4

Posso citare l'OP: "Mi piacerebbe costruirli usando formiche in modo da sfruttare l'integrazione continua." - L'OP in realtà non vuole usare Eclipse e quali creare con Ant. – Martin

+2

@ Martin, sono comunque contento che abbia condiviso questa risposta perché ho avuto lo stesso problema ma non uso Ant. –

+0

@Tom Dignan: E tu non sei l'unico - questa risposta fuori tema ha più uptotes quindi la risposta accettata ;-) – Martin

2

Come @fadden detto, lo stesso codice è in due diversi APK. Questo può ad es. si verificano quando il progetto testato e testato dipendono entrambi dallo stesso progetto di libreria Android. Ciò non deve essere diretto in quanto i progetti bibliotecari possono dipendere da altri progetti di biblioteca.

Il problema nel file delle regole delle formiche sembra essere risolto. Almeno negli strumenti SDK r11. L'obiettivo di compilazione può essere trovato in mail_rules.xml e non in test_rules.xml, solo per coloro che sono confusi.

8

Ho avuto un problema simile, utilizzando Intellij IDEA (11.1.1). La mia app avrebbe creato e distribuito correttamente sul dispositivo, la mia app di test rilascerebbe tonnellate di errori di dex quando ho provato a eseguirla: "Classe ref in classe pre-verificata risolta all'implementazione inaspettata" ...

 
app 
    test-app 
common-libs 

app depends on common-libs (and exports common-libs) 
test-app depends on app 

Questo post mi ha aiutato a capire che il problema riguardava i file di classe duplicati nell'app e nei file .dex dell'applicazione di test, che ho quindi verificato manualmente. Si scopre che per escludere le classi dell'app dall'app di prova, nelle impostazioni del modulo per l'app di test, avevo bisogno di cambiare l'ambito della sua dipendenza, app, da 'compilare', a 'fornito'.

+1

Mi hai appena salvato ore di ricerca. Grazie! :) – Melv

+0

Ho avuto lo stesso problema e ho trovato una soluzione qui –

0

Ho affrontato lo stesso problema con i test di unità eseguiti da Maven. Rimuovendo il collegamento alle librerie Android già importate dal progetto principale il problema è stato risolto.

0

L'ambito del progetto da testare deve essere compilato e quello delle librerie deve essere fornito.

Per di più, leggi here

0
android update test-project -m <project path> -p <test project path> 

ant clean 

ant debug 

Dopo aver eseguito questi comandi, è possibile eseguire i test di formiche. Nota: se fornisce errori relativi a JUnit, aggiungere il file jar Junit nella cartella libs del progetto di test.

Problemi correlati