SQLiteOpenHelper的Android JUnit测试

时间:2011-12-14 04:40:25

标签: android sqlite junit

我是junit测试的新手。

任何人都可以帮助我,如何测试我的SQLiteOpenHelper课程。

表示我必须实现哪些类以及如何测试我的数据库和表。 我正在使用Eclipse IDE。

4 个答案:

答案 0 :(得分:66)

自API级别24起,RenamingDelegatingContext已弃用。 Another主题建议使用Robolectric RuntimeEnvironment.application中描述的this Medium articlepublic 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 } }

旧答案供参考:

对于一个简单的DatabaseHandler:

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 which is not connected to the standard database of the App
    }
}

我创建了一个AndroidTestCase:

{{1}}

答案 1 :(得分:4)

你也可以write android database test in JUnit4 style。您只需在数据库中添加以下依赖项

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

并按如下方式标记Test class

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

答案 2 :(得分:2)

现在,v24中不推荐使用RenamingDelegatingContext。使用Robolectric进行测试。一个例子(在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

进行详细说明

答案 3 :(得分:0)

这个问题非常抽象。 我建议您阅读Android测试指南。它有一些测试Android应用程序的简单示例。

Android Testing Support Library

Android Testing Training

在不知道您的代码的情况下,我认为您的SQLiteOpenHelper由Activity或Service使用。我认为这个活动/服务是你必须要测试的。

对于服务的Activity或ServiceTestCase,一个良好的开端应该是ActivityInstrumentationTestCase2

我希望它有所帮助。