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 } }
这个问题很抽象。 我build议您阅读Androidtesting指南。 它有一些testingAndroid应用程序的简单例子。
Androidtesting支持库
Androidtesting培训
不知道你的代码,我想你的SQLiteOpenHelper被一个Activity或Service使用。 我认为这个活动/服务是你必须testing的。
一个好的开始应该是一个Activity的ActivityInstrumentationTestCase2或一个Service的ServiceTestCase。
我希望它有帮助。