2016-04-05 6 views
1

をテストそれでもNPEにつながります。エスプレッソでのApplicationContextを取得できません、私は私のエスプレッソテストを実行すると、次のエラーを取得しておく

私は間違っていますか?

私はSharedPrefs管理する自分のアプリケーションで使用していSessionManagerクラス:

パッケージcom.nullpointexecutioners.buzzfilms.helpersを。

輸入android.content.Context。 import android.content.SharedPreferences;

輸入com.firebase.client.Firebase。 import com.nullpointexecutioners.buzzfilms.Major;

/** 
* Helper class for managing a session (i.e. persistence across launches of the app 
*/ 
public class SessionManager { 

    private static SessionManager sInstance; 

    private final SharedPreferences pref; 
    private final SharedPreferences.Editor editor; 

    //SharedPref file name 
    private static final String PREF_NAME = "current.user"; 

    //All Shared Preferences Keys 
    private static final String IS_LOGIN = "IsLoggedIn"; 

    //Username 
    public static final String KEY_USERNAME = "username"; 

    //Name 
    public static final String KEY_NAME = "name"; 

    //Email 
    public static final String KEY_EMAIL = "email"; 

    //Major 
    public static final String KEY_MAJOR = "major"; 

    //is an Admin 
    public static final String IS_ADMIN = "isAdmin"; 

    final Firebase mRef = new Firebase("redacted"); 

    /** 
    * Constructor for instance of SessionManager 
    * @param context of session 
    * @return instance of SessionManager 
    */ 
    public static SessionManager getInstance(Context context) { 
     if (sInstance == null) { 
      sInstance = new SessionManager(context); 
     } 
     return sInstance; 
    } 

    /** 
    * Constructor for SessionManager class 
    * @param context of session 
    */ 
    private SessionManager(Context context) { 
     pref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); 
     editor = pref.edit(); 
    } 

    /** 
    * Create login session 
    * @param username to store in SharedPrefs 
    * @param name name of a user 
    * @param email to store in SharedPrefs 
    * @param major major of a user 
    * @param isAdmin determines if a user is admin or not 
    */ 
    public void createLoginSession(String username, String name, String email, String major, boolean isAdmin) { 
     /*Store each value into SharedPrefs*/ 
     editor.putBoolean(IS_LOGIN, true); 
     editor.putString(KEY_USERNAME, username); 
     editor.putString(KEY_NAME, name); 
     editor.putString(KEY_EMAIL, email); 
     if (major.equals(Major.NONE.toString())) { 
      editor.putString(KEY_MAJOR, "NONE"); 
     } else { 
      editor.putString(KEY_MAJOR, major); 
     } 

     editor.putBoolean(IS_ADMIN, isAdmin); 

     //Commit changes to SharedPrefs 
     editor.apply(); 
    } 

    /** 
    * Update the current Session's values 
    * @param name to update 
    * @param email to update 
    * @param major to update 
    */ 
    public void updateSession(String name, String email, String major) { 
     /*Store the updated values into SharedPrefs*/ 
     editor.putString(KEY_NAME, name); 
     editor.putString(KEY_EMAIL, email); 
     if (major.equals(Major.NONE.toString())) { 
      editor.putString(KEY_MAJOR, "NONE"); 
     } else { 
      editor.putString(KEY_MAJOR, major); 
     } 

     //Commit changes to SharedPrefs 
     editor.apply(); 
    } 

    /** 
    * Checks if current user is logged in 
    * If false, the user is redirected to WelcomeActivity to login or register 
    * @return true or false depending if we're logged in 
    */ 
    public boolean checkLogin() { 
     return pref.getBoolean(IS_LOGIN, false); 
    } 

    /** 
    * Checks if current user is an Admin 
    * If false, the user won't have access to Admin functions 
    * @return true or false depending if the user is an Admin 
    */ 
    public boolean checkAdmin() { 
     return pref.getBoolean(IS_ADMIN, false); 
    } 

    /** 
    * Getter for currently logged in user's username 
    * @return current user's username 
    */ 
    public String getLoggedInUsername() { 
     String username = null; 
     if (pref.contains(KEY_USERNAME) && pref.getBoolean(IS_LOGIN, false)) { 
      username = pref.getString(KEY_USERNAME, null); 
     } 
     return username; 
    } 

    /** 
    * Getter for currently logged in user's name 
    * @return current user's name 
    */ 
    public String getLoggedInName() { 
     String name = null; 
     if (pref.contains(KEY_NAME) && pref.getBoolean(IS_LOGIN, false)) { 
      name = pref.getString(KEY_NAME, "name"); 
     } 
     return name; 
    } 

    /** 
    * Getter for currently logged in user's email 
    * @return current user's email 
    */ 
    public String getLoggedInEmail() { 
     String email = null; 
     if (pref.contains(KEY_EMAIL) && pref.getBoolean(IS_LOGIN, false)) { 
      email = pref.getString(KEY_EMAIL, null); 
     } 
     return email; 
    } 

    /** 
    * Getter for currently logged in user's major 
    * @return current user's major 
    */ 
    public String getLoggedInMajor() { 
     String major = null; 
     if (pref.contains(KEY_MAJOR) && pref.getBoolean(IS_LOGIN, false)) { 
      major = pref.getString(KEY_MAJOR, null); 
     } 
     return major; 
    } 

    /** 
    * Clears session credentials 
    */ 
    public void logoutUser() { 
     //UnAuth from Firebase 
     mRef.unauth(); 

     //Clear SharedPrefs and set IS_LOGIN to false 
     editor.clear(); 
     editor.putBoolean(IS_LOGIN, false); 
     editor.commit(); 
    } 

    /** 
    * Getter for accessing the current SharedPrefs 
    * @return this session's SharedPrefs 
    */ 
    public SharedPreferences getPref() { 
     return pref; 
    } 
} 

答えて

5

あなただけgetSharedPreferencesを使用したい場合は、

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

SharedPrefsだけを使用したい場合、このコードはそのアクティビティを起動しようとします。 InstrumentationRegistry.getInstrumentation()。getTargetContext()を使用する方が良いでしょう。 – Siamaster

0

テストのthis.getContext()は、あなたのTestLoginクラスのコンテキストを取得します。

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

とあなたのテストのために:

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

ので、あなたの共有設定に加えて、私は例えば、同様にあなたのアプリケーション内のアプリケーションのコンテキストでsharedpreferencesを使用することをお勧めします

YourActivity.getApplicationContext(); 

を使用しますアプリケーション内のすべてのアクティビティ内で同じです。

+0

'MainActivity.getApplicationContext()'この試験の内側は不可能です。 'getSharedPreferences()'が非静的メソッドを持っていると参照できません。私の実際のアプリケーションに関しては、 'SharedPreferences'とのすべての対話を処理する' SessionManager'クラスがあります。代わりにそれを使うべきですか?私はそのコードでOPを更新しました。 – Nxt3

1

を試してみてください、あなたはこれを試していましたか?

InstrumentationRegistry.getInstrumentation().getTargetContext()

+0

答えが受け入れられたはずです。 getActivity()は、作成されていない場合、アクティビティの起動を試みます。私はそれを望んでいませんでした。 – Siamaster

関連する問題