2013-08-02 4 views
8

Ich schreibe einen Unit-Test Robolectric und ich muss eine Assertion machen, dass ein ImageView setImageResource(int) mit einer bestimmten Ressource-ID aufgerufen hat. Ich verwende fest-android für Assertions, aber es scheint nicht diese Behauptung zu enthalten.Assertion ImageView wurde mit spezifischer Zeichen-Ressourcen-ID geladen

Ich habe auch versucht, die ShadowImageView von Robolectric für die ImageView zu bekommen, weil ich weiß, dass es Ihnen Zugang zu diesem gab, aber es ist jetzt weg.

Schließlich habe ich versucht, setImageDrawable in meinem Code statt setImageResource, dann in meinem Test wie dies behaupten zu nennen:

assertThat(imageView).hasDrawable(resources.getDrawable(R.drawable.some_drawable)); 

aber dies nicht gelingt auch, obwohl die Fehlermeldung zeigt deutlich, es ist die gleiche Drawable Wesen ist geladen.

Antwort

5

Ich landete Verlängerung fest-android dieses Problem zu lösen:

public class CustomImageViewAssert extends ImageViewAssert { 

    protected CustomImageViewAssert(ImageView actual) { 
     super(actual); 
    } 

    public CustomImageViewAssert hasDrawableWithId(int resId) { 
     boolean hasDrawable = hasDrawableResourceId(actual.getDrawable(), resId); 
     String errorMessage = String.format("Expected ImageView to have drawable with id <%d>", resId); 
     Assertions.assertThat(hasDrawable).overridingErrorMessage(errorMessage).isTrue(); 
     return this; 
    } 

    private static boolean hasDrawableResourceId(Drawable drawable, int expectedResId) { 
     BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; 
     Bitmap bitmap = bitmapDrawable.getBitmap(); 
     ShadowBitmap shadowBitmap = (ShadowBitmap) shadowOf(bitmap); 
     int loadedFromResourceId = shadowBitmap.getCreatedFromResId(); 
     return expectedResId == loadedFromResourceId; 
    } 
} 

Die magische Sauce ist:

ShadowBitmap shadowBitmap = (ShadowBitmap) shadowOf(bitmap); 
int loadedFromResourceId = shadowBitmap.getCreatedFromResId(); 

das ist Robolectric spezifisch, so kann ich nicht eine Pull-Anforderung einreichen Fest -android mit diesem.

23

Mit Robolectric 2.2:

Sie haben einen leichten Umweg zu nehmen, dies zu erreichen. Die ShadowImageView hilft nicht. Verwenden ShadowDrawable statt:

ImageView imageView = (ImageView) activity.findViewById(R.id.imageview); 
ShadowDrawable shadowDrawable = Robolectric.shadowOf(imageView.getDrawable()); 
assertEquals(R.drawable.expected, shadowDrawable.getCreatedFromResId()); 

Hoffnung, die

+0

funktioniert wie ein Charme –

+2

In robolectric 2.4 ist das Verfahren 'getImageResourceId()' – danielcooperxyz

6

Von Roboelectric hilft 3.0+

Dies ist, wie Sie tun können:

int drawableResId = Shadows.shadowOf(errorImageView.getDrawable()).getCreatedFromResId(); 
assertThat("error image drawable", R.drawable.ic_sentiment_dissatisfied_white_144dp, is(equalTo(drawableResId))); 
Verwandte Themen