รับบริบทของโครงการทดสอบในกรณีทดสอบ Android Junit


108

มีใครรู้บ้างว่าคุณสามารถรับบริบทของโครงการทดสอบได้อย่างไรในกรณีทดสอบ Android junit (ขยาย AndroidTestCase)

หมายเหตุ: การทดสอบไม่ใช่การทดสอบเครื่องมือวัด

หมายเหตุ 2: ฉันต้องการบริบทของโครงการทดสอบไม่ใช่บริบทของแอปพลิเคชันจริงที่ทดสอบ

ฉันต้องการสิ่งนี้เพื่อโหลดไฟล์บางไฟล์จากเนื้อหาจากโครงการทดสอบ


ทำไมคุณไม่สามารถใช้ InstrumentationTestCase ได้?
yorkw

1
เนื่องจากฉันกำลังทดสอบบริการไม่ใช่ UI
peceps

1
มีคำตอบที่ดีกว่าที่นี่: [การใช้ AndroidTestCase แทนการทดสอบ JUnit] [1] [1]: stackoverflow.com/questions/3170706/…
Jaime Botero

คำตอบ:


137

มีแนวทางใหม่ใน Android Testing Support Library (ปัจจุบันandroidx.test:runner:1.1.1) Kotlin อัปเดตตัวอย่าง:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

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

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

หากคุณต้องการเรียกใช้บริบทของแอปด้วย:

InstrumentationRegistry.getInstrumentation().targetContext

ตัวอย่างการทำงานแบบเต็ม: https://github.com/fada21/AndroidTestContextExample

ดูที่นี่: getTargetContext () และ getContext (บน InstrumentationRegistry) ต่างกันอย่างไร


1
สุดท้ายคือคำตอบเกี่ยวกับวิธีใช้ JUnit4 กับ InstrumentationTest หลังจากค้นหามาหลายชั่วโมง ต้องรักการพัฒนา Android
Fabian Zeindl

1
ดี! tx (โปรดทราบว่ามีการพิมพ์ผิดในสมาชิกชั้นเรียนของคุณ)
Greg

1
ใครสามารถช่วยเกี่ยวกับสิ่งที่ต้องเพิ่มการอ้างอิงในไฟล์ gradle เพื่อให้สามารถใช้งานได้
Greg

1
อย่าลืมเพิ่มcompile "com.android.support.test:runner:1.0.1"ใน gradle ของคุณ
egorikem

2
เลิกใช้แล้วให้ใช้InstrumentationRegistry.getInstrumentation().contextแทน
Allan Veloso

37

หลังจากการวิจัยบางส่วนดูเหมือนว่าโซลูชันการทำงานเพียงอย่างเดียวที่ Yorkw ชี้ให้เห็นแล้ว คุณต้องขยาย InstrumentationTestCase จากนั้นคุณจึงสามารถเข้าถึงบริบทของแอปพลิเคชันทดสอบของคุณโดยใช้ getInstrumentation () getContext () - นี่คือข้อมูลโค้ดสั้น ๆ โดยใช้คำแนะนำข้างต้น:

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
ใช่ แต่ดูเหมือนจะโง่ที่ Android ไม่ให้การเข้าถึงบริบทโครงการทดสอบในการทดสอบ JUnit แบบง่ายๆ บริบทมีอยู่ใน AndroidTestCase.mTestContext แต่เป็นแบบส่วนตัว ฉันไม่เห็นว่าทำไม
peceps

@peceps Full Ack - แต่นั่นเป็นเพียงวิธีการและฉันก็ไม่ชอบมันเหมือนกัน;)
AgentKnopf

25

ในขณะที่คุณสามารถอ่านในรหัสที่มา AndroidTestCaseที่getTestContext()วิธีการที่ถูกซ่อนอยู่

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

คุณสามารถข้าม@hideคำอธิบายประกอบโดยใช้การสะท้อน

เพียงเพิ่มวิธีการต่อไปนี้ในของคุณ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;
    }
}

แล้วโทรได้getTestContext()ทุกเมื่อที่คุณต้องการ :)


2
ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันและฉันโหลดเนื้อหาโดยใช้ Context อย่างใดอย่างหนึ่งของ AndroidTestCase ด้วยวิธีนี้หรือ ActivityInstrumentationTestCase2.getInstrumentation () .getContext () จากนั้น getResources () .getAssets ()
Andrew Mackenzie

คุณสามารถคาดเดาได้หรือไม่ว่าทำไมพวกเขาถึงซ่อนมันไว้? หากเราใช้เทคนิคนี้พวกเขาสามารถนำวิธีนี้ไปใช้ในการเผยแพร่ในภายหลังได้หรือไม่ (ทำลายรหัสทดสอบของเรา)
Andrew Shepherd

1
ฉันได้รับjava.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()
kurdtpage

4

อัปเดต: AndroidTestCaseคลาสนี้เลิกใช้แล้วใน API ระดับ 24 ใช้InstrumentationRegistryแทน ควรเขียนการทดสอบใหม่โดยใช้ไลบรารีสนับสนุนการทดสอบ Android ลิงก์ไปยังประกาศ

คุณควรขยายจาก AndroidTestCase แทน TestCase

ภาพรวมคลาส AndroidTestCase
ขยายสิ่งนี้หากคุณต้องการเข้าถึงทรัพยากรหรือสิ่งอื่น ๆ ที่ขึ้นอยู่กับบริบทกิจกรรม

AndroidTestCase - นักพัฒนา Android


4

หากคุณต้องการรับบริบทด้วย Kotlin และ Mockito คุณสามารถทำได้ด้วยวิธีต่อไปนี้:

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

ฉันหวังว่ามันจะช่วยคุณได้


รับค่าว่างในบริบท?
Deven

และอย่าลืมใส่คำอธิบายประกอบการทดสอบชั้นเรียนด้วย @RunWith (MockitoJUnitRunner :: class)
USMAN osman

2

นี่คือวิธีที่ถูกต้องในการรับบริบท วิธีอื่นเลิกใช้แล้ว

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context


1

สำหรับผู้ที่ประสบปัญหาเหล่านี้ขณะสร้างการทดสอบอัตโนมัติคุณต้องทำสิ่งนี้:

    Context instrumentationContext;

    @Before
    public void method() {

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

        MultiDex.install(instrumentationContext);
    }

0

คำตอบอื่น ๆ ล้าสมัย ตอนนี้ทุกครั้งที่คุณขยาย AndroidTestCase จะมีวัตถุบริบท mContext ที่คุณสามารถใช้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.