尝试在SQLite DB

时间:2016-07-09 14:02:34

标签: android sqlite android-studio testing junit

我正在尝试在一个小项目中为我的SQLite DB创建一个测试用例。

此代码段在MainActivity.java上正常工作:

FileDbHelper dbHelper = new FileDbHelper(getApplicationContext());
SQLiteDatabase database = dbHelper.getWritableDatabase();

当我尝试运行带有以下行的应用程序测试(androidTest)时,我收到错误:

FileDbHelper dbHelper = new FileDbHelper(mContext);
SQLiteDatabase database = dbHelper.getWritableDatabase(); // error I get is referring to this line (line 28). 

我得到的具体错误是:

  

junit.framework.AssertionFailedError:构造函数中的异常:   testAndroidTestCaseSetupProperly(java.lang.NullPointerException:   尝试调用虚方法   ' android.database.sqlite.SQLiteDatabase   android.content.Context.openOrCreateDatabase(java.lang.String,int,   android.database.sqlite.SQLiteDatabase $ CursorFactory,   android.database.DatabaseErrorHandler)'在null对象引用上   在   android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)   在   android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)   在   com.permasse.apps.file.android.ApplicationTest。(ApplicationTest.java:28)   at java.lang.reflect.Constructor.newInstance(Native Method)at   java.lang.reflect.Constructor.newInstance(Constructor.java:288)at   junit.runner.BaseTestRunner.getTest(BaseTestRunner.java:118)at at   android.test.AndroidTestRunner.getTest(AndroidTestRunner.java:149)at   android.test.AndroidTestRunner.setTestClassName(AndroidTestRunner.java:57)   在   android.test.suitebuilder.TestSuiteBuilder.addTestClassByName(TestSuiteBuilder.java:78)   在   android.test.InstrumentationTestRunner.parseTestClass(InstrumentationTestRunner.java:444)   在   android.test.InstrumentationTestRunner.parseTestClasses(InstrumentationTestRunner.java:425)   在   android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:371)   在   android.app.ActivityThread.handleBindApplication(ActivityThread.java:4933)   在android.app.ActivityThread.access $ 1500(ActivityThread.java:144)at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1424)   在android.os.Handler.dispatchMessage(Handler.java:102)at   android.os.Looper.loop(Looper.java:155)at   android.app.ActivityThread.main(ActivityThread.java:5696)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1028)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823))at   android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)at   android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)at   android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)   在   android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1976)

我尝试将上下文更改为getApplication.getApplicationContext(),但之后在第26行引发了错误。

如果我理解正确,测试类无法获取对数据库的引用,因为它返回一个null对象。但为什么?这是关于上下文的错误吗?

更新

以下两行都会引发java.lang.NullPointerException

String dbaddress1 = mContext.getDatabasePath("file.db").toString();
String dbaddress2 = getContext().getDatabasePath("file.db").toString();

我很确定这是与上下文相关的错误,但不知道如何解决它。

更新

它变得非常愚蠢到将我的测试写入ApplicationTest()函数。应该单独编写测试方法,测试函数的名称应该从test开始。例如testMethod1()(见this SO回答)。

但是现在我得到了#34;空的测试套件"错误。随着我的进步会更新。

2 个答案:

答案 0 :(得分:0)

使用它来获得可读写的SQLiteDatabase:

 SQLiteDatabase database;
 String DATABASE_PATH = myContext.getDatabasePath("your db name").toString();
 public void openDatabase() throws SQLException {
 database =    SQLiteDatabase.
 openDatabase(DATABASE_PATH,null,SQLiteDatabase.OPEN_READWRITE);
 }

答案 1 :(得分:0)

知道了。这完全是因为没有阅读这本怪异的手册。将这些依赖项添加到build.gradle就可以了。

androidTestCompile 'com.android.support:support-annotations:23.4.0'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'

Android Developer page

所述

确保com.android.support:support-annotations版本与您的编译版本匹配。