2017-03-06 11 views
1

Ich versuche, eine Aktivität in Robolectric zu erstellen, aber es schlägt fehl, weil das XML der Aktivität nicht aufgebläht wurde. Ich habe die beanstandeten Komponenten unten aufgeführt. Ich konnte online noch keine befriedigende Antwort finden.Robolectric RuntimeException beim Anwenden des Android-Stils - ShadowAssetManager.buildAttribute

Ich habe versucht, benutzerdefinierte Shadow-Klassen zu erstellen, aber das hat nicht funktioniert (https://github.com/robolectric/robolectric/issues/2155#issuecomment-283890626).

Dies scheint ein grundlegendes Problem zu sein, dass jeder, der die Android-Attribute verwendet, in sich trägt, also bin ich mir nicht wirklich sicher, was hier falsch läuft.

mActivity = Robolectric.buildActivity(TestActivity.class) 
      .withIntent(intent) 
      .create() 
      .get(); 

Unten ist die XML-Attribut wird der säumige Stil

<ProgressBar 
    android:id="@+id/blocking_progress_bar" 
    style="?android:attr/indeterminateProgressStyle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:indeterminate="true" 
    android:interpolator="@android:interpolator/cycle" /> 

Unten enthält, ist, dass Stack-Trace.

Caused by: java.lang.RuntimeException: no value for android:attr/indeterminateProgressStyle in theme with applied styles: [Style android:Theme_DeviceDefault (and parents) (forced), Style com.package.name:Theme_XXX (and parents) (forced)] 
    at org.robolectric.shadows.ShadowAssetManager.buildAttribute(ShadowAssetManager.java:463) 
    at org.robolectric.shadows.ShadowAssetManager.attrsToTypedArray(ShadowAssetManager.java:532) 
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:213) 
    at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java) 
    at android.content.Context.obtainStyledAttributes(Context.java:532) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 

EDIT

Nachfolgend wurde die Lösung für mein Problem, obwohl ich immer noch ein Robolectric Bug ist das Gefühl, es.

Wechseln von style = "? Android: attr/indeterminateProgressStyle" zu style = "@ android: style/Widget.ProgressBar.Small" behebt das Problem.

Robolectric Issue with ProgressBar

Antwort

0

Ich habe eine Abhilfe zu bekommen die Ausnahme java.lang.RuntimeException: no value for android:attr/indeterminateProgressStyle in theme with applied styles gefunden. Der unten gezeigte Code funktioniert auch für andere Ansichten, die nicht aufgepumpt werden können, da im Design mit den angewendeten Stilen kein Wert gefunden wurde.

Schritt 1) ​​Erstellen Sie eine ShadowTheme Klasse org.robolectric.shadows.ShadowResources.ShadowTheme erstreckt, wie unten zu sehen:

import android.content.res.Resources; 
import android.content.res.TypedArray; 
import android.util.AttributeSet; 
import org.robolectric.Robolectric; 
import org.robolectric.annotation.Implementation; 
import org.robolectric.annotation.Implements; 
import org.robolectric.shadows.ShadowResources; 

@Implements(value = Resources.Theme.class) 
public class ShadowTheme extends ShadowResources.ShadowTheme { 


@Implementation 
@Override 
public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { 
    try { 
     return super.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes); 
    } catch (Throwable err) { 
     AttributeSet attributeSet = Robolectric.buildAttributeSet() 
       .addAttribute(android.R.attr.layout_width, "0dp") 
       .addAttribute(android.R.attr.layout_height, "0dp") 
       .build(); 
     return super.obtainStyledAttributes(attributeSet, attrs, defStyleAttr, defStyleRes); 
    } 
} 
} 

Schritt 2: Schatten auf @RunWith Schatten Annotation Wert, wie unten zu sehen:

import android.os.Build; 
import com.superbalist.android.BuildConfig; 
import com.superbalist.android.test.shadow.ShadowTheme; 
import org.junit.runner.RunWith; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.annotation.Config; 

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, 
    sdk = Build.VERSION_CODES.N_MR1, 
    shadows = {ShadowTheme.class}) 
public class MyUnitTest { 

} 
Verwandte Themen