はじめに
Android / Kotlin のテストでよく使われる断言ライブラリには、Truth と AssertJ があります。
両者は JUnit の assertEquals よりも読みやすく、強力な Fluent API を提供してくれますが、特徴や得意分野が異なります。
本記事では、それぞれの違いを整理し、使い分けの指針を示します。
1. 基本情報
| 項目 | Truth | AssertJ |
|---|---|---|
| 出自 | Google 製(Android/Guava/Proto との親和性が高い) | Java 全般で人気の OSS |
| API 特色 | シンプル・直観的・軽量 | 非常に表現力豊富、複雑な検証に強い |
| 学習コスト | 低め | やや高い(機能が多い) |
| Kotlin との相性 | 良好(Android プロジェクトでよく使われる) | もちろん利用可能だが Java 的表現が多め |
2. Gradle 設定例(JUnit5 前提)
dependencies {
// Truth
testImplementation("com.google.truth:truth:1.4.2")
// AssertJ
testImplementation("org.assertj:assertj-core:3.26.0")
// JUnit5
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
}
tasks.withType<Test> { useJUnitPlatform() }
3. 基本文法の比較
数値・文字列
// Truth
assertThat(5).isEqualTo(5)
assertThat("Android").startsWith("And")
// AssertJ
assertThat(5).isEqualTo(5)
assertThat("Android").startsWith("And")
コレクション
// Truth
assertThat(listOf(1,2,3)).containsExactly(1,2,3).inOrder()
// AssertJ
assertThat(listOf(1,2,3)).containsExactly(1,2,3)
例外
// Truth
val e = assertThrows<IllegalArgumentException> {
throw IllegalArgumentException("bad")
}
assertThat(e).hasMessageThat().contains("bad")
// AssertJ
assertThatThrownBy {
throw IllegalArgumentException("bad")
}.isInstanceOf(IllegalArgumentException::class.java)
.hasMessageContaining("bad")
4. AssertJ の強み
Soft Assertions(まとめて検証)
val soft = SoftAssertions()
soft.assertThat(10).isLessThan(5) // 失敗1
soft.assertThat("abc").contains("z") // 失敗2
soft.assertAll() // 複数失敗を一括表示
extracting() でプロパティ検証
data class User(val id: Int, val name: String)
val users = listOf(User(1,"Anna"), User(2,"Bob"))
assertThat(users)
.extracting("name")
.containsExactly("Anna", "Bob")
5. Truth の強み
シンプル & 読みやすい
assertThat(mapOf("a" to 1)).containsEntry("a", 1)
assertThat(listOf(1,2,3)).containsNoneOf(9, 10)
エラーメッセージが分かりやすい
JUnit よりも親切で、失敗時の差分が直感的に理解できる。
6. チートシート(よく使う表現)
| 検証内容 | Truth | AssertJ |
|---|---|---|
| 空/非空 |
isEmpty() / isNotEmpty()
|
同左 |
| サイズ | hasSize(n) |
同左 |
| 要素を含む | contains(x) |
contains(x) |
| 完全一致 | containsExactly(...).inOrder() |
containsExactly(...) |
| 文字列部分一致 |
startsWith("a") / contains("ab")
|
同左 |
| 誤差付き比較 | isWithin(0.01).of(3.14) |
isCloseTo(3.14, within(0.01)) |
| 例外 |
assertThrows { … } → hasMessageThat()
|
assertThatThrownBy { … } |
7. 選び方の指針
- Android プロジェクト / シンプルさ重視 → Truth
- Java 資産が多い / 複雑な検証が必要 → AssertJ
- プロジェクトによっては両方を併用するケースもあり
まとめ
- Truth は 軽量・直感的・Android 向き
- AssertJ は 強力で表現力豊富・複雑検証に最適
- どちらも JUnit5 と組み合わせることで、テストコードの可読性と保守性を大きく向上させられる