Frage Kontext des Testprojekts im Android junit-Testfall abrufen


Weiß jemand, wie Sie den Kontext der Testprojekt im Android junit Testfall (erweitert AndroidTestCase).

Hinweis: Der Test ist NICHT Instrumentierungstest.

Hinweis 2: Ich brauche den Kontext des Testprojekts, nicht den Kontext der tatsächlichen Anwendung, die getestet wird.

Ich brauche das, um einige Dateien von Assets aus dem Testprojekt zu laden.


75
2017-12-22 14:55


Ursprung


Antworten:


Es gibt einen neuen Ansatz mit der Android Testing Support Library (derzeit com.android.support.test: runner: 0.3).

@RunWith(AndroidJUnit4.class)
@MediumTest
public class SomeClassTest {

    private Context instrumentationCtx;

    @Before
    public void setup() {
        instrumentationCtx = InstrumentationRegistry.getContext();
    }

    @Test
    public void someTest() {
        ...

Wenn auch App-Kontext ausgeführt werden soll:

InstrumentationRegistry.getTargetContext();

Schau hier: Was ist der Unterschied zwischen getTargetContext () und getContext (in InstrumentationRegistry)?


91
2018-06-17 11:52



Nach einigen Recherchen scheint die einzige funktionierende Lösung die bereits erwähnte yorkw zu sein. Sie müssten InstrumentationTestCase erweitern und dann mit getInstrumentation () auf den Kontext Ihrer Testanwendung zugreifen. GetContext () - hier ist ein kurzer Codeausschnitt, der die obigen Vorschläge verwendet:

public class PrintoutPullParserTest extends InstrumentationTestCase {

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

37
2018-01-15 14:17



Wie Sie in der AndroidTestCase-Quellcode, das getTestContext() Methode ist versteckt.

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

Sie können die. Umgehen @hide Annotation mit Reflektion.

Fügen Sie einfach die folgende Methode in Ihrem ein 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;
    }
}

Dann ruf an getTestContext() Wann immer du willst. :)


25
2018-01-09 10:16



Sie sollten von AndroidTestCase statt von TestCase ausgehen.

AndroidTestCase-Klassenübersicht
Erweitern Sie dies, wenn Sie auf Ressourcen oder andere Dinge zugreifen müssen, die vom Aktivitätskontext abhängen.

AndroidTestCase - Android Entwickler


3
2018-03-06 15:56



Wenn Sie nur auf Ressourcen Ihres Projekts zugreifen möchten, können Sie diese verwenden getActivity () Methode von ActivityInstrumentationTestCase2-Klasse:

 //...
 private YourActivityClass mActivity;
 @Override
 protected void setUp() throws Exception {
 //...
     mActivity = getActivity();

 }
 //...
 public void testAccessToResources() {
     String[] valueList;
     valueList = 
         mActivity.getResources().getStringArray(
                 com.yourporject.R.array.test_choices);
 }

0
2017-08-21 01:47



Die anderen Antworten sind veraltet. Jedes Mal, wenn Sie AndroidTestCase erweitern, gibt es jetzt ein mContext Context-Objekt, das Sie verwenden können.


0
2018-06-12 21:03