2010-11-12 12 views
14

adlı bir etkinliğin sınanacağını test ediyorum Bir etkinlik için testler yapıyorum (test sınıfım ActivityInstrumentationTestCase2'yi genişletiyor), bazı temel testler yazdım ve iyi çalışıyor.setResult

Ancak, tamamlandığında etkinliğim setResult (resultcode, Intent i) aracılığıyla arama etkinliğine fazladan veri döndürür. Enstrümantasyonu kullanarak yapmak istediğim aktiviteyi bitirmek için bitir, daha sonra setResult çağrısı sırasında geçirilenleri kontrol et.

Bunu yapmanın bir yolu var mı? Henüz bir şey bulamadım, tek bir yaklaşım etkinlik sınıfının alt sınıfını almak ve setResult'u geçersiz kılmak için & setResultult'a geçtiğini ifşa etmek için setResult'u geçersiz kılmak olurdu (setResult finali sona erdi, yani bunu yapamazsınız) Daha iyi bir yol olmalı gibi görünüyor.

cevap

1

başka bir yaklaşım JMockit gibi modern alaycı framework kullanmak olurdu - Sen benim birim testlerinde bunun örneğini görebilirsiniz emülatör vb olmadan android sınıfların davranışını simüle bu şekilde: https://github.com/ko5tik/jsonserializer (önceki versiyonları ile birlikte JSON karşı çalıştı android ve GSON karşı fiili, ama mantığını alay

5

başka benzer soruya benim cevap bakınız) hala var:

Sen yansıması kullanmak ve Aktivite doğrudan değerlerini yakalayabilir. Başka bir questiom cevap olarak

protected Intent assertFinishCalledWithResult(int resultCode) { 
    assertThat(isFinishCalled(), is(true)); 
    try { 
    Field f = Activity.class.getDeclaredField("mResultCode"); 
    f.setAccessible(true); 
    int actualResultCode = (Integer)f.get(getActivity()); 
    assertThat(actualResultCode, is(resultCode)); 
    f = Activity.class.getDeclaredField("mResultData"); 
    f.setAccessible(true); 
    return (Intent)f.get(getActivity()); 
    } catch (NoSuchFieldException e) { 
    throw new RuntimeException("Looks like the Android Activity class has changed it's private fields for mResultCode or mResultData. Time to update the reflection code.", e); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 
9

, ayrıca Robolectric kullanmak ve test altında Etkinliği gölge olabilir. Daha sonra ShadowActivity, bir Etkinliğin bitip bitmediğini ve sonuç kodunun alındığını kolayca anlamanız için yöntemler sunar. Örnek olarak

, benim testlerden biri şuna benzer: Robolectric için

@Test 
public void testPressingFinishButtonFinishesActivity() { 
    mActivity.onCreate(null); 
    ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); 

    Button finishButton = (Button) mActivity.findViewById(R.id.finish_button); 
    finishButton.performClick(); 

    assertEquals(DummyActivity.RESULT_CUSTOM, shadowActivity.getResultCode()); 
    assertTrue(shadowActivity.isFinishing()); 
} 

ShadowActivity shadow = Shadows.shadowOf(activity); 
ile

ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); 

yerine 3+

İlgili konular