Java 如何停止将DatabaseHelper测试添加到应用程序实际数据库?

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

我已经建立了一个联系人应用程序,并试图学习编写测试。在我的TestAddContact通过的那一刻,除了每次运行它之外,它实际上是在向应用程序数据库添加数据。如何使测试不会添加到实际的应用程序数据中

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);
    }
}