Aslında, bunun için bir API çağrısının yanıtını almam gerekiyor Context
.
Aslında, bunun için bir API çağrısının yanıtını almam gerekiyor Context
.
Yanıtlar:
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.gradle
dosyanıza ekleyin :
testImplementation 'androidx.test:core:1.0.0'
bağlamı şununla alın:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
statik kodda (ile açıklanmış yöntemler gibi) kullanmadığınızdan emin olun . @BeforeClass
null
Ekle
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
Ve kullan:
private val app = ApplicationProvider.getApplicationContext()
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.
Uygulama bağlamını almak için aşağıdakileri yapmanız gerekir:
Bu benim için Robolectric 3.5.1 ile çalışıyor: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
veya RuntimeEnvironment.application.getApplicationContext()
sizin için çalışıyorsa.
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 RuntimeEnvironment
ve ShadowApplication
şu anda bunu yansıttığını unutmayın .)
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.default
paket 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.
Direkt kullanmak Robolectric.getShadowApplication()
yerine kullanmak daha güvenlidir Robolectric.application
.
Robolectric.application
@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'
}
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 )
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