Robolectric'te bir uygulamanın içeriğine nasıl erişebiliriz?


112

Aslında, bunun için bir API çağrısının yanıtını almam gerekiyor Context.

Yanıtlar:


218

Güncelleme.

Sadece 1.x ve 2.x sürümleri için kullanın:

Robolectric.application;

Ve 3.x sürümü için:

RuntimeEnvironment.application;

Ve 4.x sürümü için:

  • build.gradledosyanıza ekleyin :

    testImplementation 'androidx.test:core:1.0.0'
    
  • bağlamı şununla alın:

    ApplicationProvider.getApplicationContext()
    

11
Testleriniz için @RunWith (RobolectricTestRunner.class) eklediniz mi?
Eugen Martynov

4
Evet ..
Ekledim

1
Bahsettiğiniz her şeyi yaptım ve hala boş kalıyorum. Eksik olabileceğim başka bir şey var mı?
Moises Jimenez

13
Ayrıca , Robolectric muhtemelen bu noktada başlatılmayacağı ve değerin olacağı için RuntimeEnvironment.applicationstatik kodda (ile açıklanmış yöntemler gibi) kullanmadığınızdan emin olun . @BeforeClassnull
sfera

1
Ayrıca bu, uygulamanın testler arasında kanamasına neden olur .. ki bu istenmeyebilir
Chris

26

Kullanabilirsiniz

RuntimeEnvironment.application

4
RoboElectric 3.0'da, Roboelectric.application artık mevcut değil, bu yüzden muhtemelen en iyi cevap bu
kenyee


16

Ekle

testImplementation "androidx.test:core-ktx:${deps.testrunner}"

Ve kullan:

private val app = ApplicationProvider.getApplicationContext()

import androidx.test.core.app.ApplicationProvider
luckyhandler

val appContext = ApplicationProvider.getApplicationContext <Context> ()
luckyhandler

2
Bu, en son Robolectric ile doğru cevaptır. Burada bahsedilen diğer yöntemler kullanımdan kaldırılmış veya kaldırılmıştır.
Gabor

7

2019'da şu an itibariyle en son Robolectric 4.3 için ''

ShadowApplication.getInstance ()

ve

Roboletric.application

ikisi de depricated. Bu yüzden kullanıyorum

Context context = RuntimeEnvironment.systemContext;

Bağlam almak için.


5

Uygulama bağlamını almak için aşağıdakileri yapmanız gerekir:

  1. annotate @RunWith (RobolectricTestRunner.class)
  2. RuntimeEnvironment.application.getApplicationContext ()

2

Bu benim için Robolectric 3.5.1 ile çalışıyor: ShadowApplication.getInstance().applicationContext


4.0 sürümünün bu yöntemi kaldıracağına dikkat edin; bağlı kalmak daha iyidir RuntimeEnvironment.applicationveya RuntimeEnvironment.application.getApplicationContext()sizin için çalışıyorsa.
qix

2

21 Temmuz'da 4.0-alpha-3 sürümünden itibaren kaldırıldılar ShadowApplication.getApplicationContext() . İle RuntimeEnvironment.application.getApplicationContext()açıklanmış herhangi bir test için yapıştırın @RunWith(RobolectricTestRunner::class).

Bir kenara, mevcut kılavuzlarında aşağıdakileri kullanarak dize kaynakları alma örneği vardır:

final Context context = RuntimeEnvironment.application;

(Javadoc'ların alfa 3.x dışı sürüm için olduğunu RuntimeEnvironmentve ShadowApplicationşu anda bunu yansıttığını unutmayın .)


2

Önce aşağıdakileri ekleyin build.gradle:

testImplementation 'androidx.test:core:1.2.0'

sonra kullan:

ApplicationProvider.getApplicationContext() as Application


2

Bazı durumlarda, Robolectris varsayılan bağlamı yerine uygulamanızın bağlamına ihtiyacınız olabilir. Örneğin, paket adınızı almak istiyorsanız. Robolectric varsayılan olarak size org.robolectric.defaultpaket adını döndürecektir . Gerçek paket adınızı almak için aşağıdakileri yapın:

build.gradle

testImplementation 'org.robolectric:robolectric:4.2.1'

Test sınıfınız:

@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {

@Test
public void fooTestWithPackageName(){
    Context context = ApplicationProvider.getApplicationContext();
    System.out.println("My Real Package Name: " + context.getPackageName());
}

}

Çalıştır / Hata Ayıklama Konfigürasyonları Çalışma dizininizin $ MODULE_DIR $ olarak ayarlandığından emin olun. görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin


1

Direkt kullanmak Robolectric.getShadowApplication()yerine kullanmak daha güvenlidir Robolectric.application.


Ama ya özel uygulamamın bazı özel özelliklerine erişmem gerekirse? Görünüşe göre gölge uygulamasından gerçek nesneyi alamıyorum.
Denis Kniazhev

@DenisKniazhev Üzgünüm, buna cevap veremem. Robolectric'i kullanmaya başladıktan kısa bir süre sonra, Travis'i CI olarak kullanmaya başladık ve iyi oynamıyorlar. Tahminim, onu uygulamanıza aktarabilirsiniz veya bu şekilde erişmek için özel bir koşucu yapmanız gerekebilir. Bol şans
drspaceboo

Teşekkürler, şimdilik sadece takılı kaldımRobolectric.application
Denis Kniazhev

6
Robolectric.getShadowApplication () kullanılamıyor
IgorGanapolsky

1

@EugenMartynov ve @rds yanıtlarını kabul edin ....

Hızlı bir örnek Volley-Marshmallow-Release'de bulunabilir.

NetworkImageViewTest.java'da

// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

Voleybol bağlantısı https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release kullanılabilir

android stüdyosunda voleybol modülüne şu şekilde bağımlılıklar eklemeniz gerekir:

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }


1

Senin durumunda, aslında test ettiğin şeyin farkında olman gerektiğini düşünüyorum. Bazen test edilemeyen kod veya görünüşte test edilemeyen kod sorunlarıyla karşılaşmak, kodunuzun yeniden düzenlenmesi gerektiğinin bir işaretidir.

Bir API çağrısı yanıtı için, API çağrısının kendisini test etmek istemeyebilirsiniz. Herhangi bir web hizmetinden bilgi göndermenin / almanın mümkün olup olmadığını test etmek gerekli olmayabilir, bunun yerine kodunuzun yanıtınızı beklenen bir malikanede işlediğini ve işlediğini test etmek gerekli olmayabilir .

Bu durumda, test etmeye çalıştığınız kodu yeniden düzenlemek daha iyi olabilir. Yanıtı ayrıştırmayı / işlemeyi basit kabul eden başka bir sınıfa ayırın ve örnek dize yanıtlarını enjekte ederek bu sınıf üzerindeString testinizi yapın .

Bu, daha fazla ya da daha az fikirleri aşağıdaki gibidir tek sorumluluk ve bağımlılık Ters Çevirme ( S ve D de KATI )


1

Tamam, bu yüzden birçok kişinin bu cevabı daha önce söylediğini ve çoktan modası geçmiş olabileceğini biliyorum

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

Boş aldım, çünkü when () kısmı sütunun başlatılmasından SONRA idi. Bazılarınıza yardımcı olabilir.

ayrıca bende var

@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

dersin başında

Ayrıca

 when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.