Android JUnittestingSQLiteOpenHelper

我是junittesting的新手。

任何人都可以帮助我,如何testing我的SQLiteOpenHelper类。

意思是我必须实现什么类,以及如何testing我的数据库和表。 我正在使用Eclipse IDE。

从API级别24开始,不推荐使用RenamingDelegatingContext。 另一个线程build议使用Robolectric的RuntimeEnvironment.application ,如本文中所述 。

旧的回答供参考:

对于一个简单的DatabaseHandler:

 public class MyDatabase extends SQLiteOpenHelper { private static final String DATABASE_NAME = "database.db"; private static final int DATABASE_VERSION = 1; public MyDatabase(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db){ // some code } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // some code } } 

我创build了一个AndroidTestCase:

 public class DatabaseTest extends AndroidTestCase { private MyDatabase db; @Override public void setUp() throws Exception { super.setUp(); RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_"); db = new MyDatabase(context); } @Override public void tearDown() throws Exception { db.close(); super.tearDown(); } //According to Zainodis annotation only for legacy and not valid with gradle>1.1: //@Test public void testAddEntry(){ // Here i have my new database wich is not connected to the standard database of the App } } 

你也可以用JUnit4风格编写android数据库testing 。 您只需要在数据库中添加以下依赖项

 androidTestCompile('com.android.support.test:runner:0.3'){ exclude group: 'com.android.support', module: 'support-annotations' } 

并标记你testing类如下

 @RunWith(AndroidJUnit4.class) public class DatabaseTest { @Test public void myFirstTest(){ //your test } } 

RenamingDelegatingContext现在在v24中被弃用了。 使用Robolectric进行testing。 一个例子(在Kotlin)如下

 @RunWith(RobolectricGradleTestRunner::class) @Config(constants = BuildConfig::class, sdk = intArrayOf(LOLLIPOP), packageName = "com.elyeproj.simpledb") class ExampleUnitTest { lateinit var dbHelper: DbHelper // This is your SQLOpenHelper class @Before fun setup() { dbHelper = DbHelper(RuntimeEnvironment.application) // Your new context from Robolectric dbHelper.clearDbAndRecreate() // A function just to clear and recreate DB } @Test @Throws(Exception::class) fun testDbInsertion() { // Given val testStr1 = "testing" val testStr2 = "testing" // When dbHelper.insertText(testStr1) dbHelper.insertText(testStr2) // Then assertEquals(dbHelper.getAllText(), "$testStr1-$testStr2-") } @After fun tearDown() { dbHelper.clearDb() // A function just to clear the DB } } 

您可以从https://github.com/elye/demo_simpledb_test获取整个项目源代码;

你可以从https://medium.com/@elye.project/android-sqlite-database-unit-testing-is-easy-a09994701162#.s44tity8x

这个问题很抽象。 我build议您阅读Androidtesting指南。 它有一些testingAndroid应用程序的简单例子。

Androidtesting支持库

Androidtesting培训

不知道你的代码,我想你的SQLiteOpenHelper被一个Activity或Service使用。 我认为这个活动/服务是你必须testing的。

一个好的开始应该是一个Activity的ActivityInstrumentationTestCase2或一个Service的ServiceTestCase。

我希望它有帮助。