2015-09-14 11 views
11

Questo problema di cui non riesco a liberarmi, ne ho provati probabilmente 3 o 4 dozzine articoli e discussioni cercando di risolverlo. Ho delineato tutto sotto.

Fondamentalmente la domanda è: il problema sta avendo un difetto con Robolectric? O c'è qualche piccolo passo che mi manca, o ho una strana combinazione di plugin. Qualsiasi consiglio su questo sarebbe molto apprezzato.

Windows 7 Versioni:

  • Gradle 2.7
  • Android 1.3.2 Studio
  • Robolectric 3.0
  • Roboguice 3. +

dipendenze del progetto:

dependencies { 
    classpath 'com.android.tools.build:gradle:1.3.0' 
    classpath "com.newrelic.agent.android:agent-gradle-plugin:4.244.0" 
    classpath 'com.github.triplet.gradle:play-publisher:1.1.2' 
    classpath 'org.moallemi.gradle.advanced-build-version:gradle-plugin:1.5.0' 
} 

App Dipendenze

import org.moallemi.gradle.internal.VersionCodeType 

apply plugin: 'com.android.application' 
apply plugin: 'newrelic' 
apply plugin: 'com.github.triplet.play' 
apply plugin: 'org.moallemi.advanced-build-version' 

android { 
def SERVICE_ACCOUNT = “account”; 
def P12_KEY = file('mykey.p12') 

signingConfigs { 
    releaseConfig { 
… 
    } 
} 

compileSdkVersion 22 
buildToolsVersion '22.0.1' 

advancedVersioning { 
    nameOptions { 
     versionMajor 6 
     versionMinor advancedVersioning.versionCode 
    } 
    codeOptions { 
     versionCodeType VersionCodeType.AUTO_INCREMENT_ONE_STEP 
    } 
} 

defaultConfig { 
    applicationId "com.my.app =" 
    minSdkVersion 15 
    targetSdkVersion 22 
    versionCode = advancedVersioning.versionCode 
    versionName = advancedVersioning.versionName 
} 

buildTypes { 
    def STRING = "String" 
    def URL = "URL" 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     signingConfig signingConfigs.releaseConfig 
    } 
    staging { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
    development { 
     minifyEnabled false 
    } 
    debug { 
     minifyEnabled false 
    } 
} 
testOptions { 
    unitTests.returnDefaultValues = true 
} 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.2.0' 
    compile 'com.google.android.gms:play-services:4.2.+' 

    compile(name: 'library-release', ext: 'aar') 

    compile 'com.squareup.okhttp:okhttp:2.4.0' 
    compile 'com.google.code.gson:gson:2.3.1' 
    compile 'org.roboguice:roboguice:3.+' 
    provided 'org.roboguice:roboblender:3.+' 

    testCompile 'junit:junit:4.12' 
    testCompile 'org.mockito:mockito-core:1.10.19' 
    testCompile "org.robolectric:robolectric:3.0" 
} 

repositories { 
flatDir { 
    dirs 'libs' 
} 
} 

personalizzato Gradle Runner

public class M1stRoboelectricGradleTestRunner extends RobolectricTestRunner { 
public M1stRoboelectricGradleTestRunner(Class<?> testClass) throws InitializationError { 
    super(testClass); 
    String buildVariant = (BuildConfig.FLAVOR.isEmpty() 
      ? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE; 
    String intermediatesPath = BuildConfig.class.getResource("") 
      .toString().replace("file:", ""); 
    intermediatesPath = intermediatesPath 
      .substring(0, intermediatesPath.indexOf("/classes")); 

    System.setProperty("android.package", 
      BuildConfig.APPLICATION_ID); 
    System.setProperty("android.manifest", 
      intermediatesPath + "/manifests/full/" 
        + buildVariant + "/AndroidManifest.xml"); 
    System.setProperty("android.resources", 
      intermediatesPath + "/res/merged/" + buildVariant); 
    System.setProperty("android.assets", 
      intermediatesPath + "/assets/" + buildVariant); 
} 

@Override protected AndroidManifest getAppManifest(Config config) { 

    String manifestProperty = System.getProperty("android.manifest"); 
    String resProperty = System.getProperty("android.resources"); 
    String assetsProperty = System.getProperty("android.assets"); 
    AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty), 
      Fs.fileFromPath(assetsProperty)){ 
    }; 
    manifest.setPackageName("com.my.app"); 
    return manifest; 
} 
} 

Classe test

@RunWith(M1stRoboelectricGradleTestRunner.class) 
public class MainActivityTest { 
    private MainActivity mActivity; 
    private Button mButton; 
    private TextView mTextView; 

@Before 
public void setup() { 

    mActivity = Robolectric.buildActivity(
      MainActivity.class).create().get(); 
    mButton = (Button) mActivity.findViewById(R.id.signInButton); 
    mTextView = (TextView) mActivity.findViewById(R.id.linkContact); 
} 

Problema: La seguente riga di codice è quello che sta gettando l'errore:

mActivity = Robolectric.buildActivity(
    MainActivity.class).create().get(); 

Inizialmente, ho provato a utilizzare il robolectricGradleTestRunner predefinito ma ho continuato a ricevere ResourceNotFound com.my.app::string/app_name non trovato. Dopo aver esaminato una quantità ridicola di articoli e blog, mi sono imbattuto in this e sono riuscito a superarlo implementando un runner personalizzato. Questo ha risolto il problema con app_name, una specie di.

  1. Se sulla classe di test ho messo @config (SDK = 21) ricevo l'errore che stavo ricevendo inizialmente:

    android.content.res.Resources $ NotFoundException: nessuna etichetta come com. my.app:string/app_name su org.robolectric.util.ActivityController.getActivityTitle (ActivityController.java:104) su org.robolectric.util.ActivityController.attach (ActivityController.java:49) su org.robolectric.util .ActivityController $ 1.run (ActivityController.java:121) su org.robolectric.shadows.ShadowLooper.runPaused (ShadowLooper.java:304) a org.robolectric.shadows.CoreShadowsAdapter $ 2.runPaused (CoreShadowsAdapter.java:45) a org.robolectric.util.ActivityController.create (ActivityController.java:118) a org.robolectric.util.ActivityController.create (ActivityController .java: 129) a org.members1st.mobile.MainActivityTest.setup (MainActivityTest.java:32) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java: 62) presso sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) presso org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) in org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) in org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) a org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:24) a org.robolectric.RobolectricTestRunner $ 2.Valutare (RobolectricTestRunner.java:251) a org.robolectric.RobolectricTestRunner.runChild (RobolectricTestRunner .java: 188) a org.robolectric.RobolectricTestRunner.runChild (RobolectricTestRunner.java:54) a org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) a org.junit.runners.ParentRunner $ 1 .schedule (ParentRunner.java:71) presso org.junit.runners.ParentRunner.runC hildren (ParentRunner.java:288) presso org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) presso org.junit.runners.ParentRunner $ 2.valore (ParentRunner.java:268) presso org. robolectric.RobolectricTestRunner $ 1.evaluate (RobolectricTestRunner.java:152) a org.junit.runners.ParentRunner.run (ParentRunner.java:363) a org.junit.runner.JUnitCore.run (JUnitCore.java:137) a com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:78) a com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:212) a com.intellij.rt.execution.junit .JUnitStarter.main (JUnitStarter.java:68) presso sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo nativo) a sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) a com.intellij.rt.execution.application.AppMain.main (AppMain.java:140)

  2. Se lascio solo l'SDK, ottengo robolectric non supporta API 22

Finora ho provato:

  1. Creazione di un costume BuildConfig e passaggio che in ogni raccomandazioni su this filo robolectric.
  2. Impostazione di packageName in @config per consigli su this thread.
  3. sovraccarico del nuovo ApplicationManifest per rispedire l'livello di API
  4. Impostazione del targetSdk a 21 nel mio Gradle presentare
  5. Praticamente ogni combinazione dei passaggi precedenti risultati nello stesso errore.
  6. verificato che l'app_name si trova nel file di risorse values.xml generato dal test di costruire

  7. Ho provato con

    mActivity = Robolectric.setupActivity (MainActivity.class);

Invece di

mActivity = Robolectric.buildActivity(
    MainActivity.class).create().get(); 

8. unit test regolari lavorano quando in esecuzione.

+0

Suggerimento: prova a formattare correttamente la domanda e sposta la domanda in alto. – natario

+0

Suggerimento eccezionale: qualche consiglio su quale sarebbe il modo migliore per esprimerlo? – aminner

+0

È un errore di modifica o il tuo 'build.gradle' ha davvero' applicationId "com.my.app =" '? –

risposta

2

Quindi la risoluzione a questo è stato un faccia a faccia di palma per me, ma si spera aiutare qualcun altro.

Il packageName è NON uguale all'IDapplicazione. Nella maggior parte degli esempi sono identici, quindi non ho notato la differenza, fino a quando non ho deciso cosa diavolo possiamo provare.

In precedenza, il nome del pacchetto era in realtà org.my.app ma il mio era ApplicationID com.my.app

Una volta che si è acceso tutto ha funzionato a meraviglia. Un tale errore da principiante!

+0

packageName è uguale a applicationId in build.gradle –

9

Hai provato

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk=21, packageName="com.my.app") 
public class MainActivityTest 
+0

Sì, ho provato che ho fatto un semplice errore stupido. Il packageName non è l'ID dell'applicazione, anche se in tutti gli esempi che ho visto erano gli stessi e quindi non ci ho pensato, ha apportato il cambiamento come parte di un ultimo disperato tentativo e ha funzionato. Super stupido errore da parte mia. – aminner

+0

Grazie mille – emaleavil

+0

Qual è lo scopo di ** sdk = 21 **? –

Problemi correlati