Java 如何停止将DatabaseHelper测试添加到应用程序实际数据库?
我已经建立了一个联系人应用程序,并试图学习编写测试。在我的TestAddContact通过的那一刻,除了每次运行它之外,它实际上是在向应用程序数据库添加数据。如何使测试不会添加到实际的应用程序数据中Java 如何停止将DatabaseHelper测试添加到应用程序实际数据库?,java,android,sqlite,testing,Java,Android,Sqlite,Testing,我已经建立了一个联系人应用程序,并试图学习编写测试。在我的TestAddContact通过的那一刻,除了每次运行它之外,它实际上是在向应用程序数据库添加数据。如何使测试不会添加到实际的应用程序数据中 package com.domscott.contactapplication; import android.content.Context; import android.database.Cursor; import androidx.test.core.app.ApplicationPr
package com.domscott.contactapplication;
import android.content.Context;
import android.database.Cursor;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import static org.junit.Assert.*;
@RunWith(AndroidJUnit4.class)
public class MyDatabaseHelperTest {
private MyDatabaseHelper database;
@Before
public void setUp() throws Exception {
database = new MyDatabaseHelper(ApplicationProvider.getApplicationContext());
}
@After
public void tearDown() {
database.close();
}
@Test
public void TestAddContact() {
ArrayList<String> idTest = new ArrayList<>();
ArrayList<String> f_nameTest = new ArrayList<>();
ArrayList<String> l_nameTest = new ArrayList<>();
ArrayList<String> phoneTest = new ArrayList<>();
database.addContact("dom","scott", "123");
Cursor cursor = database.readData();
while (cursor.moveToNext()) {
idTest.add(cursor.getString(0));
f_nameTest.add(cursor.getString(1));
l_nameTest.add(cursor.getString(2));
phoneTest.add(cursor.getString(3));
Assert.assertEquals(f_nameTest.get(0), "dom");
}
}
}
您可以在设置db时为测试使用内存中(将为测试执行时间创建)db,或者您可以为测试和应用程序的用户创建具有不同名称的db。您应该使用除
ApplicationProvider.getApplicationContext
-@OneCricketer以外的其他名称。我尝试过这个<代码>私有MyDatabaseHelper数据库;上下文上下文=InstrumentationRegistry.getInstrumentation().getTargetContext()@在public void setUp()引发异常之前{database=new MyDatabaseHelper(context);}并得到相同的结果。关于使用什么有什么建议吗?你的MyDatabaseHelper
类是否做了一些特定于应用程序数据本身的事情?@OneCricketeer我已将该类添加到原始帖子中。MyDatabaseHelper拥有CRUD的所有方法以及getRandomContact方法。我在那里做了什么导致了这个问题?可能在OnCreate?中,您还可以为数据库名称提供null
,以创建内存中的数据库。
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.Nullable;
import java.nio.charset.IllegalCharsetNameException;
import java.util.ArrayList;
import java.util.List;
//DataBase operations class
public class MyDatabaseHelper extends SQLiteOpenHelper {
private Context context;
private static final String DATABASE_NAME = "Contacts.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "contacts";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_FIRST_NAME = "first_name";
private static final String COLUMN_LAST_NAME = "last_name";
private static final String COLUMN_PHONE = "_phone";
//constructor
MyDatabaseHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
//Create DB
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " + TABLE_NAME +
" (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_FIRST_NAME + " TEXT, " +
COLUMN_LAST_NAME + " TEXT, " +
COLUMN_PHONE + " TEXT);";
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
//method for adding a contact to the DB
void addContact(String firstName, String lastName, String phone) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_FIRST_NAME, firstName);
values.put(COLUMN_LAST_NAME, lastName);
values.put(COLUMN_PHONE, phone);
long result = db.insert(TABLE_NAME, null, values);
}
//Method that uses an SQL query for reading all the data from the DB to display on the mainActivity.
Cursor readData() {
String query = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
if(db != null) {
cursor = db.rawQuery(query, null);
}
return cursor;
}
//Method using SQL query to update data of a contact
void updateData(String row_id, String fName, String lName, String phone) {
SQLiteDatabase db =this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_FIRST_NAME, fName);
values.put(COLUMN_LAST_NAME, lName);
values.put(COLUMN_PHONE, phone);
long result = db.update(TABLE_NAME, values, "_id=?", new String[]{row_id});
if(result == -1) {
Toast.makeText(context, "Failed to Update", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "Update Successful", Toast.LENGTH_SHORT).show();
}
}
//Contact deletion method
void deleteContact(String row_id) {
SQLiteDatabase db = this.getWritableDatabase();
long result = db.delete(TABLE_NAME,"_id=?", new String[] {row_id});
if (result == -1) {
Toast.makeText(context, "Delete Failed", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "Contact Deleted", Toast.LENGTH_SHORT).show();
}
}
//Method using SQL query to select a random contact from the DB
public Cursor getRandomContact()
{
SQLiteDatabase myDB = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_NAME +
" ORDER BY RANDOM() LIMIT 1";
return myDB.rawQuery(query, null);
}
}