はじめに
今回はDB
に対してテストコードを書いてみました。
コードを書くためには
テストコードを書く場所は前回のテストコードと同じExampleUnitTestと同じファイルにClassを作成します。

必要なライブラリ
次に、テストコードを書く際に必要なライブラリは次のようになります。
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)
}
}
テストするには
先ほど記載した各関数ごとにテストをすることで、
期待通りの結果になっているか確認することができます。
失敗時はコードが見切れていますが、
実際のDBのデータと期待結果のDBデータを記載してくれています!

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