Android junit test senaryosunda test projesi bağlamını alın


108

Android junit test senaryosunda Test projesinin bağlamını nasıl elde edebileceğinizi bilen var mı (AndroidTestCase'i genişletir).

Not: Test, enstrümantasyon testi DEĞİLDİR.

Not 2: Test edilen asıl uygulamanın bağlamına değil, test projesinin içeriğine ihtiyacım var.

Test projesindeki varlıklardan bazı dosyaları yüklemek için buna ihtiyacım var.


Neden InstrumentationTestCase'i kullanamıyorsunuz?
yorkw

1
Çünkü UI'yi değil hizmetleri test ediyorum.
48'de peceps

1
Burada bulunan daha iyi bir cevap var: [JUnit testi yerine AndroidTestCase kullanarak] [1] [1]: stackoverflow.com/questions/3170706/…
Jaime Botero,

Yanıtlar:


137

Android Test Destek Kitaplığı'nda (şu anda androidx.test:runner:1.1.1) yeni bir yaklaşım var . Kotlin güncellenmiş örnek:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

    @Before
    fun setup() {
        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
    }

    @Test
    fun someTest() {
        TODO()
    }
}

Ayrıca uygulama bağlamını çalıştırmak istiyorsanız:

InstrumentationRegistry.getInstrumentation().targetContext

Tam çalışan örnek: https://github.com/fada21/AndroidTestContextExample

Buraya bakın: getTargetContext () ve getContext (InstrumentationRegistry'de) arasındaki fark nedir?


1
Son olarak JUnit4'ün InstrumentationTest ile nasıl kullanılacağına dair bir cevap. Saatler süren aramadan sonra. Android geliştirmeyi sevmelisiniz.
Fabian Zeindl

1
Güzel! tx (sınıf üyenizde bir yazım hatası olduğunu unutmayın)
Greg

1
Bunun çalışması için gradle dosyasına hangi bağımlılıkların eklenmesi gerektiği konusunda biri yardımcı olabilir mi?
Greg

1
Eklemeyi unutmayın compile "com.android.support.test:runner:1.0.1"sizin gradle için
egorikem

2
Kullanımdan kaldırıldı, InstrumentationRegistry.getInstrumentation().contextonun yerine kullanın.
Allan Veloso

37

Biraz araştırmadan sonra, işe yarayan tek çözüm, Yorkw'un daha önce işaret ettiği gibi görünüyor. InstrumentationTestCase'i genişletmeniz gerekir ve ardından getInstrumentation () kullanarak test uygulamanızın içeriğine erişebilirsiniz. GetContext () - işte yukarıdaki önerileri kullanarak kısa bir kod parçacığı:

public class PrintoutPullParserTest extends InstrumentationTestCase {

    public void testParsing() throws Exception {
        PrintoutPullParser parser = new PrintoutPullParser();
        parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
    }
}

7
Evet, ancak Android'in basit JUnit testlerinde test projesi bağlamına erişim sağlamaması aptalca görünüyor. Bağlam, AndroidTestCase.mTestContext'te mevcuttur ancak özeldir. Neden anlamıyorum
peceps

@peceps Tam Ack - ama şu ne kadar ve ben de bundan sevmiyorum;)
AgentKnopf

25

AndroidTestCase kaynak kodunda okuyabileceğiniz gibi , getTestContext()yöntem gizlidir.

/**
 * @hide
 */
public Context getTestContext() {
    return mTestContext;
}

@hideYansımayı kullanarak açıklamayı atlayabilirsiniz .

Aşağıdaki yöntemi eklemeniz yeterlidir AndroidTestCase:

/**
 * @return The {@link Context} of the test project.
 */
private Context getTestContext()
{
    try
    {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    }
    catch (final Exception exception)
    {
        exception.printStackTrace();
        return null;
    }
}

O getTestContext()zaman istediğiniz zaman arayın . :)


2
Benim için mükemmel bir şekilde çalıştı ve bu yöntem aracılığıyla AndroidTestCase veya ActivityInstrumentationTestCase2.getInstrumentation () .getContext () ve ardından getResources () .getAssets ()
Andrew Mackenzie

Neden gizlediklerini tahmin edebilir misiniz? Bu tekniği kullanırsak, yöntemi daha sonraki bir sürümde kaldırabilirler mi (test kodumuzu kırabilirler mi?
Andrew Shepherd

1
I getjava.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()
kurdtpage

4

Güncelleme: AndroidTestCase Bu sınıf, API seviyesi 24'te kullanımdan kaldırılmıştır. Onun InstrumentationRegistryyerine kullanın . Yeni testler Android Test Destek Kitaplığı kullanılarak yazılmalıdır. Duyuru bağlantısı

TestCase yerine AndroidTestCase'den genişletmelisiniz.

AndroidTestCase Sınıfına Genel Bakış
Kaynaklara veya Etkinlik Bağlamına bağlı diğer şeylere erişmeniz gerekiyorsa bunu genişletin.

AndroidTestCase - Android Geliştiricileri


4

Kotlin ve Mockito ile bağlamı elde etmek istiyorsanız, bunu şu şekilde yapabilirsiniz:

val context = mock(Context::class.java)

Umarım sana yardımcı olur


bağlamda boş mu oluyor?
Deven

Ve test sınıfınıza @RunWith (MockitoJUnitRunner :: class) ile açıklama eklemeyi unutmayın
USMAN osman

2

Bu, Bağlamı elde etmenin doğru yolu. Diğer yöntemler zaten kullanımdan kaldırıldı

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

2
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();

1

Otomatik testler oluştururken bu sorunlarla karşılaşanlar için şunu yapmalısınız:

    Context instrumentationContext;

    @Before
    public void method() {

        instrumentationContext = InstrumentationRegistry.getInstrumentation().getContext();

        MultiDex.install(instrumentationContext);
    }

0

Diğer cevaplar güncel değil. Şu anda AndroidTestCase'i her genişletişinizde, kullanabileceğiniz mContext Context nesnesi vardır.

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.