Truthを使ってみる2019/03/23AndroidXのTestではGoogleのアサーションライブラリのTruthが使われるみたいです。TestTruthを必ず使えというよりもAndroidXのテストサポートとしてTruthの拡張が提供されるから、より書きやすくなるよーということだと思います。どんなものかなーと思ってTruthを使ってみました。使い始めたばかりなのでいろいろ間違いがあると思いますので、参考程度に見ていただければと思います。Testでアサーションを書くときはAssertJを使っていました。JUnitのアサーションにAssertJを使う基本的なアサーションには触れずにオブジェクト、リスト、例外のアサーションについて書いていきたいと思います。オブジェクトのアサーション一番よく使うアサーションだと思います。Classにアサーションを行っていきます。"")基本的なアサーションTruth.assertThat(task.id).isEqualTo(1)Truth.assertThat(task.title).isEqualTo("title")Truth.assertThat(task.description).isEqualTo("description")他のライブラリと比較してもあんまり変わらないと思います。AssertJの場合は基本的なプリミティブ、タイプ以外にも例えばFileクラスの場合はFile専用のアサーションメソッド等が生えてきます。今の所Truthは基本的なプリミティブ、タイプとGuavaのタイプをサポートしているみたいです。Typesapplyを使ってFluentlyなアサーションTruthはAssertJのように複数のアサーションをメソッドチェーンで書くことはできません。AssertJでは以下のようにかけますがTruthではかけません。");ただメソッドチェーンでつなげることはできませんがKotlinの場合スコープ関数を使うことで同様に記載することができます。以下はapplyを使った例です。")}AssertThatはSubject型(タイプ)を返すのでapplyブロック内ではレシーバはSubjectとなりアサーションが使えます。Contextがはっきりしていて個人的には違和感はあまり感じませんでした。上記はSubject型にスコープ関数を生やしましたが、オブジェクトに対してスコープ関数を生やすこともできます。Truth.assertThat(description).isEqualTo("description")}複数のオブジェクトをアサーションするときにブロックとして表現できるので、良いのではないかと思いました。Generatorでタイプ別のアサーションを作ってくれるプラグインもあるみたいです。リストのアサーション続いてリスト(コレクション)のアサーションです。TruthにはIterableのSubjectがあるので基本的なアサーションは可能です。.inOrder()さてAssertJだといわゆるフィルターしてアサーションみたいなことを書けます。以下だとAssertJのextractingを使ってリスト内のnameプロパティの値を取り出してアサーションしています。アサーション対象を一時変数に書かなくても良い利点があります。"user5");これをTruthでできるか検証しました。結果、現時点のバージョン0.43ではAssertJほど簡単にはできないみたいです。Correspondenceを実装したクラスを作成して抽出条件をかいてIterableSubjectのcomparingElementsUsingで指定することで実現可能だと思いますがAssertJに比べると敷居はかなり高いと思われます。現在開発中と思われるバージョン0.44でもう少し簡単に実装する手段としてTransformingが提供されるみたいです。GitHubのIssueはこちらになります。残念ながら0.44はまだリリースされていないので、GitHubからTransforming関連のクラス・メソッドだけ抜き出してTruthTransformingとして実装しました。.inOrder()}taskのリストからtitleプロパティの値を抜き出してアサーションを行っています。これが読みやすいかというのは一旦おいておきましょう・・・。よい書き方があるんだろうと思います。これでもまだ、敷居と可読性はAssertJが優位があると思いますが、こういう方法もあるよということで。あと、ソースコードのコメントを参考にしているので使い方とか書き方は間違っている可能性が高いので参考程度にお願いします。例外もThrowableのSubjectがあるので基本的なアサーションは可能です。個人的にAssertJで一番好きなのが例外のテストです。empty.");applyを使うと以下のようにかけます。hasCauseThat().hasMessageThat().isEqualTo("cause")}全く同じにはかけませんが、それでも同様な表現はできるのではないかと思います。まとめ現時点で認知度はAssertJの方があると思いますが、今後AndroidXのTest関連の状況次第ではTruthも認知度が上がってくることが予想されます。個人的にはもしJavaを使うならAssertJを使うかなーと思いますが、Kotlinに関してはスコープ関数を使うことで多少ではありますがFluentlyに書けます。スコープ関数は人によって書き方が違ったりするので乱立するとAssertJの方が書き方を統一できるとは思います。Truthを使い始めたばかりなのでいろいろわかっていないことが多く、特にTruthはエラー時のメッセージをわかりやすく表示するための仕組みがあるので、今後このあたりも使っていってもう少し習熟度を上げたいと思います。この記事のソースコードはGitHubにプシュしてあります。コメントをキャンセルメールアドレスが公開されることはありません。Epoxyについて最近RecyclerViewを使うときにAirbnb製のEpoxyというライブラリを使っています。Authenticationを設定する先日、Firebaseプロジェクトを作成しアプリを追加しました。今回はFirebaseのAuthenticationを設定してみようと思います。今、自分が会社で作っているアプリはPush通知が届かないとサービスが成り立たない重要な通知となっております。Messaging(FCM)を使っています。Sharingを使う機会があったのでメモを残します。3.4からコードシュリンカー・難読化にR8がデフォルトで使用されるようになりました。AFFINGER5.。