我正在尝试在一个小项目中为我的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;空的测试套件"错误。随着我的进步会更新。
答案 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'
所述
确保com.android.support:support-annotations版本与您的编译版本匹配。