2014-10-22 9 views
8

Ich bin nicht in der Lage, Robolectic-Test zu starten, wenn neue Appcompat-Support-Bibliothek verfügbar seit Android Lollipop kam. Ich habe gefolgt:Android Lollipop Appcompat Probleme mit Robolectric

Mein aktueller Fortschritte hier verfügbar: https://github.com/fada21/android-tdd-bootstrap

Meine Konfiguration (destillierte) ist:

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.0.1" 

defaultConfig { 
    applicationId "com.fada21.android.bootstrap" 
    minSdkVersion 15 
    targetSdkVersion 21 

..

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:21.0.0' 
    compile 'com.android.support:appcompat-v7:21.0.0' 

...

androidTestCompile('org.robolectric:robolectric:2.4-SNAPSHOT') { 

ich ein Problem hier angehoben habe: https://github.com/robolectric/robolectric/issues/1332 (hier für weitere Details).

Dies ist Fehler Ich erhalte:

java.lang.RuntimeException: Could not find any resource from reference ResName{com.fada21.android.bootstrap:style/Theme_AppCompat_Light_NoActionBar} from style StyleData{name='AppTheme', parent='Theme_AppCompat_Light_NoActionBar'} with theme null 
at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getParent(ShadowAssetManager.java:456) 
at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getAttrValue(ShadowAssetManager.java:394) 
at org.robolectric.shadows.ShadowResources.getOverlayedThemeValue(ShadowResources.java:297) 
at org.robolectric.shadows.ShadowResources.findAttributeValue(ShadowResources.java:286) 
at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:189) 
at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:48) 
at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:494) 
at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:489) 
at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:484) 
at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java) 
at android.content.Context.obtainStyledAttributes(Context.java:380) 
at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:143) 
at android.support.v7.app.ActionBarActivityDelegateBase.onCreate(ActionBarActivityDelegateBase.java:139) 
at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:123) 
at com.fada21.android.bootstrap.HomeActivity.onCreate(HomeActivity.java:28) 
at android.app.Activity.performCreate(Activity.java:5133) 
at org.fest.reflect.method.Invoker.invoke(Invoker.java:112) 
at org.robolectric.util.ActivityController$1.run(ActivityController.java:113) 
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:265) 
at org.robolectric.util.ActivityController.create(ActivityController.java:110) 
at org.robolectric.util.ActivityController.create(ActivityController.java:120) 
at com.fada21.android.bootstrap.HomeActivityTest.testActivityNotNull(HomeActivityTest.java:24) 
+0

Ich folge zur Zeit dieses Thema https://github.com/robolectric/robolectric/issues/1332#issuecomment-61470450. Die gleichen Probleme haben. – loeschg

+1

Ja, ich habe diesen Thread gestartet. @loeschg Hast du diesen ShadowSupportMenuInflater im Kommentar erwähnt? – fada21

+0

Ich habe das versucht ... denke ich. Ich plane morgen einen fokussierten Blick. Danke, dass du mir diese Richtung gezeigt hast! – loeschg

Antwort

13

HINWEIS: Ab 07.07.15 wurde Roboelectric 3.0 freigegeben. Es löst das fragliche Problem und macht diese Antwort nicht länger notwendig.

Alte Antwort:

Bis Robolectric 3.0 kommt, ist hier eine Lösung.

#/app/src/main/res/values/styles.xml 
<resources> 

    //<!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     //<!-- Customize your theme here. --> 
    </style> 


    //<!-- Hack for Robolectric to run with appcompat.v7 --> 
    <style name="RoboAppTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
     //<!-- Customize your theme here. --> 
    </style> 

</resources> 

Und dann Ihre benutzerdefinierte RobolectricRunner Klasse

public class MyRobolectricTestRunner extends RobolectricTestRunner { 
    private static final int MAX_SDK_SUPPORTED_BY_ROBOLECTRIC = 18; 

    public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected AndroidManifest getAppManifest(Config config) { 
     String manifestProperty = "../app/src/main/AndroidManifest.xml"; 
     String resProperty = "../app/src/main/res"; 
     return new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty)) { 
      @Override 
      public int getTargetSdkVersion() { 
       return MAX_SDK_SUPPORTED_BY_ROBOLECTRIC; 
      } 

      @Override 
      public String getThemeRef(Class<? extends Activity> activityClass) { 
       return "@style/RoboAppTheme"; 
      } 
     }; 
    } 
} 

anpassen Grundsätzlich sind wir nur die JVM zu sagen, ein anderes App Thema zu verwenden. Dann benutze diesen TestRunner wie du es normalerweise mit @RunWith(MyRobolectricTestRunner.class) machen würdest.

Hinweis: Diese Aktivitäten befasst, die nur extend Activity, andere Fragen des gleichen Typs für Aktivitäten auftreten, die extend ActionBarActivity

EDIT: Ab 4/7/15, Robolectric 3.0-Snapshot-Build verfügbar ist was für ActionBarActivity gilt. Weitere Informationen finden Sie in den Links in den Kommentaren

+0

gibt es alles, was Sie für Aktivitäten tun, die von ActionBarActivity verlängern? All meine Aktivitäten erstrecken sich von ActionBarActivity – ZakTaccardi

+0

@ZakTaccardi Ich habe nicht gegraben hinein genug, um herauszufinden, habe ich einfach die Lösung geschrieben, dass mein Anwendungsfall festgelegt. Sie können [Robolectric 3.0-Snapshot] ausprobieren (https://github.com/robolectric/robolectric#using-snapshots), die ich Unterstützung für ActionBarActivity hat glauben? Ich bin mir nicht sicher. Du musst noch mehr graben. Es tut uns leid. [Hier sind einige weitere Informationen] (https://github.com/robolectric/robolectric/issues/1446) – drees

+0

Robolectric 3.0 ist der Weg zu gehen, wenn Sie noch Robolectic benötigen. Ich denke, mit neuen Android-Test-Bibliothek ist eine bessere Lösung. – fada21

0

könnte irgendeine Lösung sein:

zum Test hinzufügen:
@Config (emulateSdk = 18, reportSdk = 18)

und machen es so etwas wie:

@RunWith(RobolectricTestRunner.class) 
@Config(emulateSdk = 18, reportSdk = 18) 
public class YourClassTestNameTest {… 
+0

das tat. Funktioniert nicht. Sie können meinen Code einchecken. – fada21

+0

Es tut mir leid, Mann, ich habe gerade in Ihrem Code gesehen, Ihr Absturz bezieht sich auf die Vollbild-Aktivität, ich habe einige Arbeiten um (möglicherweise funktioniert) dafür gesehen, wie die Anwendung eines Parameters auf das Thema oder einige verwenden anderes Thema für diese Aktivität im Test. Entschuldigung momentan auf Handy. Viel Glück! Fügen Sie einige Teile aus Stack Spuren wie Thema und App kompakt Google, ich glaube, Sie werden etwas finden :) – cV2

1

Mit diesem benutzerdefinierten RobolectricTestRunner wurde ein ähnliches Problem behoben, das ich hatte. Dies bedeutet auch, dass Sie @Config (emulateSdk = 18) nicht in jedem Test benötigen.

ersetzen: @RunWith (RobolectricTestRunner.class)

mit: @RunWith (MyRobolectricTestRunner.class) in allen Robolectric testet

public class MyRobolectricTestRunner extends RobolectricTestRunner { 

    public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected AndroidManifest getAppManifest(Config config) { 
     String manifestProperty = System.getProperty("android.manifest"); 
     if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) { 
      String resProperty = System.getProperty("android.resources"); 
      String assetsProperty = System.getProperty("android.assets"); 
      CustomAndroidManifest androidManifest = new CustomAndroidManifest(
        Fs.fileFromPath(manifestProperty), 
        Fs.fileFromPath(resProperty), 
        Fs.fileFromPath(assetsProperty)); 
      androidManifest.setPackageName("com.justyoyo"); 
      return androidManifest; 
     } 
     return super.getAppManifest(config); 
    } 

    private static class CustomAndroidManifest extends AndroidManifest { 

     private static final int MAX_SDK_SUPPORTED_BY_ROBOLECTRIC = 18; 

     public CustomAndroidManifest(FsFile androidManifestFile, FsFile resDirectory, FsFile assetsDirectory) { 
      super(androidManifestFile, resDirectory, assetsDirectory); 
     } 

     @Override 
     public int getTargetSdkVersion() { 
      return MAX_SDK_SUPPORTED_BY_ROBOLECTRIC; 
     } 
    } 
} 

Kredit dazu: https://github.com/robolectric/robolectric/issues/1025

2

eine project.properties Datei auf der gleichen Ebene hierarki hinzufügen als Manifest, mit folgendem Inhalt:

android.library.reference.1=../../build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.0.0 

Achten Sie darauf, die appcompat Version ist das gleiche wie in Ihrer Gradle-Datei.

0
@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 

löste mein Problem.

Verwandte Themen