2016-02-19 15 views
27

Bir şey gizlendiğinde, Mockito bir proxy örneği oluşturur. Şimdi, o proxy örneğinde çalıştırılan ayarlayıcıları arkasındaki gerçek örneğe iletmenin herhangi bir yolu var mı?Bir etkinlik için uygun şekilde nasıl casusluk yapılır

Rasyonel: Tamamen denetimimin altında, yani bir Android etkinliğimde bulunmayan bir nesne örneğim var. Uygulamamın çoğunu proxy sürümüne verebilirim ve ama gibi iyi çalışır, çünkü aktivitenin oluşturma aşamasında çok erken casus/proxy oluşturmam gerekir, henüz tam olarak örneklenmemiş, ör. Temel içerik eklenmedi. Bu proxy örneğinde olur ve elbette etkinlik örneği tarafından kullanılmaz (Activity.this aracılığıyla kendisine atıfta bulunur). Sonuç olarak, bu durum her türlü çökmeye yol açmaktadır, çünkü kaynak çözümlemesi bu temel bağlamda gerçekleşmektedir, böylece dahili Parçalama makinesi NPE'leri ve daha fazlasını atar. - herhangi bir fikir

public class CustomAndroidJUnitRunner extends AndroidJUnitRunner { 
    @Override 
    public Activity newActivity(ClassLoader cl, String className, Intent intent) 
      throws InstantiationException, IllegalAccessException, ClassNotFoundException { 
     Activity activity = super.newActivity(cl, className, intent); 
     return maybeStubSomeDelegate(activity); 
    } 

    private Activity maybeStubSomeDelegate(Activity activity) { 
     if (!(activity instanceof SomeDelegate)) { 
      return activity; 
     } 
     Activity spiedActivity = spy(activity); 
     doReturn(SomeDelegateMock.getInstance()) 
      .when((SomeDelegate) spiedActivity) 
      .getDelegate(); 
     return spiedActivity; 
    } 
} 

Ben clueless değilim: Burada

bazı kodudur? ,

+0

Neden espresso kullanmayın: https://google.github.io/android-testing-support-library/docs/espresso/ da aktivitesini kontrol edebilirsiniz Yani. –

+0

Espresso'yu kullanıyorum, bunun sorumu ile ilgisi yok. –

+0

, soru dışındaki etkinliğinize @VisibleForTesting setDelegate() yöntemi ekliyor mu? Faaliyetin casuslarını enjekte etmeyi içeren herhangi bir yaklaşımın, her zaman işe yaramayacağı bazı durumlara sahip olacağını hissediyorum. – jdonmoyer

cevap

0

Kendi proxy oluşturmak için Robolectric kullanabilirsiniz (veya Robolectric "Shadows" deyimiyle) Aktivitenize Proxy oluştururken,

gerçek nesne yöntemleri tetikleyebilir kendi ayarlayıcıları oluşturabilir bir gölge örnek oluşturmak için nasıl

: @RealObject gerçek örneği olduğunda

@Implements(Bitmap.class) 
public class MyShadowBitmap { 

@RealObject private Bitmap realBitmap; 
private int bitmapQuality = -1; 

@Implementation 
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) { 
    bitmapQuality = quality; 
    return realBitmap.compress(format, quality, stream); 
} 

public int getQuality() { 
    return bitmapQuality; 
} 
} 
} 

,

bu s kullanmak için Robolectric için

shadowOf() 

Ve her durumda

, burada s: link:

@RunWith(RobolectricTestRunner.class) 
@Config(shadows = MyShadowBitmap.class) 
public class MyTestClass {} 

akım gölge örneği yöntemi kullanmak çekin: hadow şöyle Robolectric testi koşucu yeni bir test sınıfını tanımlamak kullanarak

http://robolectric.org/custom-shadows/

+0

Bu, ünite testi için yararlı olabilir, ancak aslında enstrümantasyon testi hakkında konuşuyordum :) –

+0

Ayrıca enstrümantasyon testleri için yararlıdır (cihaz \ emülatöründe çalıştırılmasını istemediğinizi varsayarak) –

İlgili konular