0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Android】Truth vs AssertJ ― 断言ライブラリ比較

Posted at

はじめに

Android / Kotlin のテストでよく使われる断言ライブラリには、TruthAssertJ があります。
両者は 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 と組み合わせることで、テストコードの可読性と保守性を大きく向上させられる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?