Soru GetActivity () öğesini çağırmadan önce Setup () 'da TestSuite uygulamasının uygulama içeriğine erişme


Benim bir Activity bir nesneyi Application genişletilmiş sınıf (uygulama içeriği) içinden OnCreate() yöntem.

Bu aktiviteyi test ederken, ihtiyaç duyulan nesne orada bulunmaz, çünkü bir önceki Faaliyetten alınır ve yukarıda belirtilen uygulama bağlamında saklanır.

Çağırdığımda söylemeye gerek yok getActivity() benim içinden ActivityInstrumentationTestCase2 genişletilmiş test durumu boş bir işaretçi istisnası alıyorum.

Bir etkinlik başlatılmadan önce içeriği nasıl doldurabilirim? Activity?

Güncellenmiş: Biraz kazdıktan sonra buldum: this.getInstrumentation().getTargetContext() ve sonra onu türümün Application genişletilmiş sınıf. Ama ben bir sınıf döküm istisnası ve bunun için iz noktaları:

04-04 21:02:27.036: INFO/TestRunner(431): started: testIt(edu.rockies.rockies.activity.courses.test.TopicTest)
04-04 21:02:27.126: INFO/TestRunner(431): failed: testIt(edu.rockies.rockies.activity.courses.test.TopicTest)
04-04 21:02:27.126: INFO/TestRunner(431): ----- begin exception -----
04-04 21:02:27.136: INFO/TestRunner(431): java.lang.ClassCastException: android.app.ApplicationContext
04-04 21:02:27.136: INFO/TestRunner(431):     at edu.rockies.rockies.activity.courses.test.TopicTest.setUp(TopicTest.java:27)
04-04 21:02:27.136: INFO/TestRunner(431):     at junit.framework.TestCase.runBare(TestCase.java:125)
04-04 21:02:27.136: INFO/TestRunner(431):     at junit.framework.TestResult$1.protect(TestResult.java:106)
04-04 21:02:27.136: INFO/TestRunner(431):     at junit.framework.TestResult.runProtected(TestResult.java:124)
04-04 21:02:27.136: INFO/TestRunner(431):     at junit.framework.TestResult.run(TestResult.java:109)
04-04 21:02:27.136: INFO/TestRunner(431):     at junit.framework.TestCase.run(TestCase.java:118)
04-04 21:02:27.136: INFO/TestRunner(431):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
04-04 21:02:27.136: INFO/TestRunner(431):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
04-04 21:02:27.136: INFO/TestRunner(431):     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
04-04 21:02:27.136: INFO/TestRunner(431):     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
04-04 21:02:27.136: INFO/TestRunner(431): ----- end exception -----
04-04 21:02:27.156: INFO/TestRunner(431): finished: testIt(edu.rockies.rockies.activity.courses.test.TopicTest)

this.getInstrumentation().getTargetContext() tip bağlamında bir nesne döndürmesi gerekiyordu. Ama ben anlıyorum android.app.ApplicationContext mantıklı olmayan sınıf döküm exeption.

Güncelleme 2:

Daha fazla araştırma yaptım ve bunu keşfettim android.app.Application

java.lang.Object
    android.content.Context
        android.app.ApplicationContext
            android.app.Application

Ancak Google’ın kendi Android Javadoc’ı bu:

java.lang.Object
    android.content.Context
        android.content.ContextWrapper
            android.app.Application

Neler oluyor? Birşey doğru değil.

3. Güncelleme:

Aşağıdaki kod satırını değiştirdim:

this.getInstrumentation().getTargetContext();

bu kod ile.

this.getInstrumentation().getTargetContext().getApplicationContext();

İçerik düzgün bir şekilde çözülmesine rağmen, etkinlikle aynı bağlamda görünmemektedir.


25
2018-04-04 20:53


Menşei


Aramayı denedin mi getActivity().getApplication()? - Macarse
Etkinliğin OnCreate () yönteminin zaten içerikte bulunan verilere bağlı olması nedeniyle yapamıyorum. GetActivity () yönteminin çağrılması, başarısız olan ve böylece boş bir işaretçi özel durumu oluşturan OnCreate () yöntemini çağırır. Bu yüzden benim ikilemim. - Salsero69
Tamam, bu sabah testlerim iyi gidiyor. Neyin değiştiğinden emin değilsiniz, ancak yukarıdaki en son güncelleme (Güncelleme 3) sorunu çözmüş görünüyor. - Salsero69
Güncelleme 3, ilk test çalışmamı yaptı, ancak sınıftaki ikinci test hala başarısız oldu. Çağrıyı getApplicationContext () 'e bıraktığımda çalıştı. Ama neden? : | - Jolanda Verhoef


Cevaplar:


Tamam, bu sorun çözüldü. GetActivity () çağrılmadan önce içeriğe erişmek için bu işlevi çağırmanız gerekir:

Context context = this.getInstrumentation().getTargetContext().getApplicationContext();

48
2018-04-05 18:28



Bu çok basit değil ya da belki şeyler değişti: Ben this.getInstrumentation (). GetTargetContext () tam olarak benim uygulama bağlamını döndürdüğünü öğrendim (eminim ki özel "MyApplication" sınıf var çünkü bunu biliyorum) VE .getApplicationContext () döndürür boş. Bu yüzden, uygulama içeriğini alan kodum da bu dava için uyarlanıyor, bkz. github.com/andstatus/andstatus/blob/master/src/org/andstatus/... , genel statik İçerik başlatılıyor (Bağlam context_in, ... nesne); - context_in, test sınıflarından çağrılırsa .getApplicationContext () yöntemine sahiptir. - yvolk
Awesome .. Teşekkürler @ Salsero69. Bu çalıştı ve testum geçti - John


Bağlam için statik yöntemi çağırabilirsiniz:

Context context = InstrumentationRegistry.getTargetContext();

Daha fazla detay burada bulunabilir: https://developer.android.com/training/testing/integration-testing/index.html


3
2018-06-27 09:42





Her zaman kullan this.getInstrumentation().getTargetContext() uygulamanın içeriğine erişmek için.

this.getInstrumentation().getTargetContext().getApplicationContext() aynı değil this.getInstrumentation().getTargetContext()

4.0.X sürümlerinde ve çoğu zaman otomasyonu çalıştırıyordum getApplicationContext() boş bağlamı döndürüyordu.


1
2017-12-28 09:51





Daha yeni UI test çerçevesi ile getInstrumentation() artık kullanılabilir değil. Tutmanın bir yolu Application nesne uygulamayı yayınlamaktır Context:

Application app = 
        (Application) InstrumentationRegistry
                .getTargetContext()
                .getApplicationContext();

1
2018-05-20 15:59