2015-04-14 25 views
10

Robolectric ile bir test oluşturmaya çalışıyorum. Amacım, bir sınıfın (örneğin kitaplıktan gelen ve kodu değiştiremeyen) özel bir işlevin işlevselliğini değiştirebilmektir.Robolectric shadow çalışmıyor

örnekte
@RunWith(RobolectricTestRunner.class) 
@Config(shadows = {ShadowMessenger.class}) 
public class TestShadow { 

    @Test 
    public void testMessenger() { 
     OriginalMessenger messenger = new OriginalMessenger(); 
     String message = messenger.getMessage(); 
     Assert.assertEquals("Shadow messenger", message); 
    } 

    public static class OriginalMessenger { 

     public String getMessage() { 
      return "Original messenger"; 
     } 
    } 

    @Implements(OriginalMessenger.class) 
    public static class ShadowMessenger extends OriginalMessenger { 

     @Implementation 
     public String getMessage() { 
      return "Shadow messenger"; 
     } 
    } 
} 

, OriginalMessenger kütüphanede olup varsayılan bir işlevsellik sağlar sınıftır:

Ben ne yapmak istediğinizi simüle etmek bu küçük testi yarattı. Ve ShadowMessenger, OriginalMessenger'u her kullandığımda uygulamak istediğim özel davranışı içeren sınıftır.

Ancak testi çalıştırdığımda başarısız oluyor. mesajının içeriği "Orijinal mesajlaşma" dır. ShadowMessenger hiç kullanılmamış gibi.

Neyi yanlış yapıyorum?

+2

Neden gölge oluşturuyorsunuz? Neden "alay" veya "saplama" yapmıyorsunuz? –

+0

Aynı sonucu, alay ve saplama kullanarak nasıl elde ederim? –

+0

Oh, nenick sorununuzu çözdüğünü görüyor mu? Sınıfınızdan veya Spock'ten (Robospock) çıkmak için EasyMock/PowerMock'ı kullanabilirsiniz. Burada bir örnek göz atın: https://github.com/jaredsburrows/BurrowsAppsExamples/blob/master/Lib-BurrowsApps/src/test/java/burrows/apps/example/lib/utils/PlayServicesUtilsTest.java. –

cevap

14

Orijinal yalnızca android sınıflarını gölgeleyebilirsiniz. Ancak özel bir robolectric test koşucusu ile kendi sınıflarınızı da gölgeleyebilirsiniz.

@Override 
protected ShadowMap createShadowMap() { 
    return new ShadowMap.Builder() 
     .addShadowClass(OriginalMessenger.class, ShadowMessenger.class, true, true, true) 
     .build(); 
} 

Robolectric 3,0

@Override 
public InstrumentationConfiguration createClassLoaderConfig() { 
    InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); 
    builder.addInstrumentedClass(OriginalMessenger.class.getName()); 
    return builder.build(); 
} 

Robolectric 2,4

@Override 
protected ClassLoader createRobolectricClassLoader(Setup setup, SdkConfig sdkConfig) { 
    return super.createRobolectricClassLoader(new ExtraShadows(setup), sdkConfig); 
} 

class ExtraShadows extends Setup { 
    private Setup setup; 

    public ExtraShadows(Setup setup) { 
     this.setup = setup; 
    } 

    public boolean shouldInstrument(ClassInfo classInfo) { 
     boolean shoudInstrument = setup.shouldInstrument(classInfo); 
     return shoudInstrument 
       || classInfo.getName().equals(OriginalMessenger.class.getName()); 
    } 
} 

Robolectric 3.1.4 (bu RobolectricTestRunner aşağıda açıklanan yöntem geçersiz kılmak için gereken şekilde RobolectricGradleTestRunner tamamen çıkarıldı) örnek proje https://github.com/nenick/android-gradle-template/

+0

Güzel! Bunun hakkında bilmiyordum –

+5

Birçok belgelenmemiş özellikler vardır;) – nenick

+0

Bunu yaparsam, bir StackOverflowError alırsınız. Neden olduğunu biliyor musun? –

İlgili konular