2016-07-29 37 views
-1

Ich habe die folgenden DatabaseHander Klasse, wo es die Speicherung einiger Daten ermöglicht, die die Benutzer von ihrem Android-Handy eingeben. dh Spieler den Namen und Spielerbewertung:Junit Test für Sqlite geben Nullzeiger Ausnahmen

public class DatabaseHandler extends SQLiteOpenHelper { 
private final ArrayList<LastGameModel> lastGameModelsList = new ArrayList<>(); 
public DatabaseHandler(Context context) { 
    super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_MOVIES_TABLE = "CREATE TABLE " + Constants.TABLE_NAME + 
      "(" + Constants.KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , " + Constants.PLAYER_NAME + 
      " TEXT, " + Constants.PLAYER_RATE + " INTEGER);"; 
    db.execSQL(CREATE_MOVIES_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + Constants.TABLE_NAME); 

    onCreate(db); 
} 

//add content to table 
public void addMovies(LastGameModel lastGameModel) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    //values.put(Constants.KEY_ID,lastGameModel.getId()); 
    values.put(Constants.PLAYER_NAME, lastGameModel.getPlayerName()); 
    values.put(Constants.PLAYER_RATE, lastGameModel.getPlayerRate()); 

    db.insert(Constants.TABLE_NAME, null, values); 

    db.close(); 

    Log.d("Theo","heeeey!data saved"); 
} 

//get all folders 
public ArrayList<LastGameModel> getBestPlayersDetails() { 

    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(Constants.TABLE_NAME, new String[]{ 
      Constants.KEY_ID, Constants.PLAYER_NAME,Constants.PLAYER_RATE}, null, null, null, null, Constants.KEY_ID + " DESC"); 


    if (cursor.moveToFirst()) { 
     do { 

      LastGameModel lgm = new LastGameModel(); 
      lgm.setPlayerName(cursor.getString(cursor.getColumnIndex(Constants.PLAYER_NAME))); 

      lgm.setPlayerRate(cursor.getInt(cursor.getColumnIndex(Constants.PLAYER_RATE))); 
      lgm.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(Constants.KEY_ID)))); 



      lastGameModelsList.add(lgm); 
     }while(cursor.moveToNext()); 


    } 
    return lastGameModelsList; 
} 

public void deletePlayer(int id){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(Constants.TABLE_NAME,Constants.KEY_ID + " = ? ",new String[] 
{String.valueOf(id)}); 
    lastGameModelsList.clear(); 
    db.close(); 
    } 
} 

Jetzt möchte ich es die obige Klasse mit JUNIT 4.

So testen:

@RunWith(JUnit4.class) 
public class DBTesting { 

public static String playerName; 
public static String playerRate; 
public static long playerId; 


Context mMockContext; 
@Test 
public void testDropDB() { 
    assertTrue(mMockContext.deleteDatabase(Constants.DATABASE_NAME)); 
} 
} 

jedoch alle die Tests fehlschlagen

Die testDropDB() gibt mir

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean 
android.content.Context.deleteDatabase(java.lang.String)' on a null object 
reference 

at team.football.ael.DBTesting.deleteTheDatabase(DBTesting.java:33) 
at team.football.ael.DBTesting.testDropDB(DBTesting.java:30) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 

Warum passiert das? Die Konstanten.DATABASE_NAME ist keine Nullzeichenfolge.

public class Constants implements BaseColumns{ 
public static final String DATABASE_NAME="ratedplayersdb"; 
public static final int DATABASE_VERSION=2; 
public static final String TABLE_NAME="ratedplayers"; 

public static final String PLAYER_NAME="playername"; 



public static final String PLAYER_RATE="player_rate"; 

public static final String KEY_ID="_id"; 



} 

Antwort

0

mMockContext ist null, wie es in der Fehlermeldung sagt

+0

oh ich sehe. Und ich dachte, ich hätte ein Problem mit meinem Constants-Tisch. Wie sollte ich den mMockContext initialisieren? – Theo

+0

Ok. Ich habe es gefunden. Ich sollte InstrumentationRegistry.getTargetContext() verwenden – Theo