-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";
}
oh ich sehe. Und ich dachte, ich hätte ein Problem mit meinem Constants-Tisch. Wie sollte ich den mMockContext initialisieren? – Theo
Ok. Ich habe es gefunden. Ich sollte InstrumentationRegistry.getTargetContext() verwenden – Theo