2016-04-05 7 views
1

halte ich die folgende Fehlermeldung erhalten, wenn meine Espresso-Tests ausgeführt werden:Kann nicht Application in Espresso bekommen testet

Attempt to invoke virtual method 'android.content.Context android.app.Instrumentation.getTargetContext()' on a null object reference

@RunWith(AndroidJUnit4.class) 
public class TestLogin extends AndroidTestCase { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class); 

    @Test 
    public void testVerifyCredentials() { 
     Context context = this.getContext().getApplicationContext(); 
     SharedPreferences prefs = context.getSharedPreferences("current.user", Context.MODE_PRIVATE); 
     assertTrue(prefs.getBoolean("IsLoggedIn", false)); 
    } 
} 

ich bereits versucht, dies als InstrumentationTestCase, und dann versucht, stattdessen Context context = this.getInstrumentation().getTargetContext().getApplicationContext(); zu tun aber das führt immer noch zur NPE.

Was mache ich falsch?

Die SessionManager Klasse I in meiner Anwendung bin mit SharedPrefs zu verwalten:

Paket com.nullpointexecutioners.buzzfilms.helpers;

importieren android.content.Context; importieren android.content.SharedPreferences;

importieren com.firebase.client.Firebase; importieren com.nullpointexecutioners.buzzfilms.Major;

Antwort

5

Wenn Sie nur getSharedPreferences verwenden,

versuchen

Activity activity = mActivityRule.getActivity(); 
SharedPreferences prefs = activity.getSharedPreferences("current.user", Context.MODE_PRIVATE); 
assertTrue(prefs.getBoolean("IsLoggedIn", false)); 
+0

Wenn er nur SharedPrefs verwenden möchte, versucht dieser Code, die Aktivität zu starten. Es ist besser, InstrumentationRegistry.getInstrumentation() zu verwenden. GetTargetContext(). – Siamaster

0

Ihr Test this.getContext() ruft den Kontext Ihrer TestLogin-Klasse ab. Verwenden Sie

YourActivity.getApplicationContext(); 

zusätzlich, empfehle ich auch in Ihrer Anwendung sharedpreferences in einem Anwendungskontext zu verwenden, zB:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

und für den Test:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(yourActivity.getApplicationContext()); 

so gemeinsam genutzten Einstellungen sind bei allen Aktivitäten in Ihrer Anwendung gleich.

+0

'MainActivity.getApplicationContext()' ist in diesem Test nicht möglich. Ich kann nicht verweisen 'getSharedPreferences()' hat eine nicht-statische Methode. Wie für meine eigentliche Anwendung habe ich eine 'SessionManager' Klasse, die alle Interaktionen mit' SharedPreferences' behandelt; soll ich das stattdessen benutzen? Ich habe das OP mit diesem Code aktualisiert. – Nxt3

1

Sie dies versuchen Haben?

InstrumentationRegistry.getInstrumentation().getTargetContext()

+0

Sollte als Antwort angenommen worden sein. getActivity() versucht, die Aktivität zu starten, wenn sie nicht erstellt wurde. Das wollte ich nicht. – Siamaster