DBに対するテストコード

# はじめに
今回はDB
に対してテストコードを書いてみました。

## コードを書くためには
テストコードを書く場所は[前回のテストコード](https://qiita.com/ie_Blue/items/dd29a8731dd59c97bb5a)と同じExampleUnitTestと同じファイルにClassを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/8968c2b5-7a04-e255-dd7d-40fc209d3956.png" width=50%>


## 必要なライブラリ
次に、テストコードを書く際に必要なライブラリは次のようになります。

build.gradle
```
/** Unit Test **/
testImplementation 'org.junit.platform:junit-platform-runner:1.1.0'
androidTestRuntimeOnly "de.mannodermaus.junit5:android-instrumentation-test-runner:$junit5_runner"

// assertion
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"

// spek
testImplementation "org.spekframework.spek2:spek-dsl-jvm:$spek_version"
testImplementation "org.spekframework.spek2:spek-runner-junit5:$spek_version"

// MockK
testImplementation 'io.mockk:mockk:1.9'

// DB
testImplementation "org.dbtools:dbtools-room-jdbc:4.4.0"
testImplementation "org.xerial:sqlite-jdbc:3.25.2"


// Test helpers for LiveData
testImplementation "android.arch.core:core-testing:1.1.0"

// Test helpers for LiveData
androidTestImplementation "android.arch.core:core-testing:1.1.0"

```

## 実際に書いてみた
ライブラリを導入した後は、
テストを実行するクラスを作成し各関数でテスト内容を書きます！

データの追加・削除を行うTodo等は今回省略しております。


DataBaseTest.kt
```
class DataBaseTest {
    lateinit var context: Context
    lateinit var appDatabase: AppDatabase
    lateinit var todoDao: TodoDao

    @get:Rule
    var instantExecutorRule = InstantTaskExecutorRule()

    @Before
    fun setUp() {
        context = mockk()
        appDatabase = Room.inMemoryDatabaseBuilder(
                context,
                AppDatabase::class.java
        ).allowMainThreadQueries()
                .openHelperFactory(JdbcSQLiteOpenHelperFactory())
                .build()
        todoDao = appDatabase.todoDao()
    }

    @After
    fun tearDown() {
        todoDao.deleteAll()
    }

// データ追加時のテスト
    @Test
    fun getAllTodo() { 
        val expected = listOf(
                createDummyTodoEntity(1),
                createDummyTodoEntity(2),
                createDummyTodoEntity(3)
        )

        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3))

        // テスト実施
        val result = todoDao.getAllTodo()

        // Todo項目を全件取得し期待値と一致していること
        result.test().assertValue(expected)
    }

//データの更新のテスト
    @Test
    fun updateTodo() { 
        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3))

        val todo = createDummyTodoEntity(3, true)
        val expected = listOf(
                createDummyTodoEntity(1),
                createDummyTodoEntity(2),
                createDummyTodoEntity(3, true)
        )

        // テスト実施
        todoDao.update(todo)

        // Todo項目を全件取得しid3の項目が更新されていること
        todoDao.getAllTodo().test().assertValue(expected)
    }

// データ削除のテスト
    @Test
    fun deleteTodo() {
        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3, true))

        val expected = listOf(
                createDummyTodoEntity(2),
                createDummyTodoEntity(3, true)
        )

        // テスト実施
        todoDao.delete(1)

        // Todo項目を全件取得しid1の項目が削除されていること
        todoDao.getAllTodo().test().assertValue(expected)
    }

// データ全削除のテスト
    @Test
    fun deleteAllTodo() {
        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3))

        val expected = emptyList<TodoEntity>()

        // テスト実施
        todoDao.deleteAll()

        // Todo項目が一件も存在しないこと
        todoDao.getAllTodo().test().assertValue(expected)
    }
}
```

## テストするには
先ほど記載した各関数ごとにテストをすることで、
期待通りの結果になっているか確認することができます。

成功時は0と表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/c2278767-24c5-d4c8-7abc-b1da66f91868.png" width=80%>


失敗時はコードが見切れていますが、
実際のDBのデータと期待結果のDBデータを記載してくれています！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/f7568aad-a4fd-63d7-623a-2cc3288449e0.png" width=80%>


# 終わりに
今回はDBに対するテストコードを書いてみました。
通常のテストコードをより必要なライブラリやコードが多かったですね。
次はAPIに対するテストコードを書いてみようと思います。