*

JUnit入門その2[Eclipse4.4のJUnitプラグインのassertThatの使い方]

公開日: : 最終更新日:2016/12/05 Eclipse, Java, JUnit ,


スポンサードリンク



JUnit入門その1[EclipseのJUnitプラグインの基本的な使い方]ではEclipseのJUnitプラグインの基本的な使い方を説明させていただきました。

今回はassertThatメソッドの説明をさせていただきます。

  1. assertThatを利用するメリットと概要の説明
  2. assertThatで利用できるMatcherと利用方法
  3. assertThatでカスタムMatcherの利用方法


1 assertThatを利用するメリットと概要の説明

assertThatの概要

「assertThat」はJunit4.4で追加された新しいアサーションメソッドです。
これまでのアサーションメソッドは、メソッド自体がアサーション条件となっていましたが、「assertThat」では、
引数にアサーション条件を指定ことが可能です。
またdescribedAsを利用することでAssertion Error 時に出力するメッセージをカスタマイズすることも可能です。

例えばJunit4.3以前であれば、テストメソッドにおける値の一般的な検証は以下のように行っていました。

assertThatを用いて以下のように記載しすると同じ検証が行えます。

assertEqualsだと期待値と実際の値の値が同じであることを期待することがassertEqualsを使った時点で決定します。
assertThatだと期待値と実際の値の値をどう評価するかをMatcherで制御できます。

また、assertNotEqualsは実際にはJUnitには存在しませんが、assertThatを利用することで実現できます。

また、前述の例ではis,notのMatcherの利用例をあげましたが、他にも多くのMatcherが利用できますし、
テスト実装者が利用したいカスタムMatcherを作成し利用することも可能です。

2 assertThatで利用できるMatcherと利用方法

assertThatで利用するMatcherはorg.hamcrest.CoreMatchersに含まれています。
なお、org.junit.matchers.JUnitMatchersに含まれている比較メソッドは現在ではDeprecatedとなっていますので
org.hamcrest.CoreMatchersの同名メソッドを利用する必要があります。

org.hamcrest.CoreMatchersのMatcher

org.hamcrest.CoreMatchersのMatcherに含まれるMatcherは以下の通りです。

Matcherメソッド名 説明
allOf 指定した全ての比較メソッドがtrueであるかチェック
anyOf 指定した比較メソッドが1つでもtrueであるかチェック
is 期待値と実際の値が同じであるかチェック、equalToのショートカット
not 論理値を反転する
equalTo 期待値と実際の値が同じであるかチェック
instanceOf 指定したクラスのインスタンスであるかチェック
sameInstance 同じインスタンスであるかチェック
anything
any
nullValue nullチェック
notNullValue not nullチェック
hasItem 指定した値を保持しているかチェック。org.junit.matchers.JUnitMatchers.hasItemは@Deprecatedです。
hasItems 指定した値を保持しているかチェック。org.junit.matchers.JUnitMatchers.hasItemsは@Deprecatedです。
containsString 実際の値(文字列)が指定した文字列を含んでいるかチェック。org.junit.matchers.JUnitMatchers.containsStringは@Deprecatedです。
both 指定した比較メソッドが全てtrueであるかチェック(and()メソッドを併用)。org.junit.matchers.JUnitMatchers.bothは@Deprecatedです。
either 指定した比較メソッドが1つでもtrueであるかチェック(or()メソッドを併用)。org.junit.matchers.JUnitMatchers.bothは@Deprecatedです。

org.hamcrest.CoreMatchersのMatcherの利用例

テストクラスの作成

利用例を説明するためのテストクラスを作成します。

具体的な作成方法については
JUnit入門その1[EclipseのJUnitプラグインの基本的な使い方]の内容を参照ください。

テストクラスを作成した後にassertThatで利用するMatcherはorg.hamcrest.CoreMatchersのstaticインポートを追加します。

ここまでの作業が終わったテストクラス(AssertThatSampleTest)は以下のようになりました。

isのサンプル

まずは一番基本のisのサンプルです。
isはequalToのショートカットでもありますので、equalToの例も一緒にしています。

以降では各テストメソッドのみを記載いたします。

notのサンプル

allOfのサンプル

指定した全ての比較メソッドがtrueであるかチェックします。

hoge.startsWith(“foo”)かつhoge.endsWith(“bar”)のように複数の条件を満たすかチェックできます。
実際のコードでは実際の値であるhogeは記載しませんので、assertEqualsを複数書くより変更に強いと言えますが
あまり多くの条件を書くと可読性は落ちます。

anyOfのサンプル

とはいえorで検証するってシチュエーションが思いつかないです。
前回テスト実行時に成功した時にはA or BのAがtrueでBがfalse、今回実行時にはAがfalseでBがtrueで成功するなんて
ユニットテストのテストケースとしてはどうかと・・・
私だったら上記の2つのパターンが明確に確認できるテストデータとアサートに分割しますが・・・

instanceOfのサンプル

JavaのinstanceOfと同じ考え方です。
anyはinstanceOfのショートカットですので同じサンプルに入れてみました。

sameInstanceのサンプル

これは少し迷いますね、同じ型のインスタンスか、同じインスタンス(ポインタが同じ)かどちらをチェックするものでしょうか?

とりあえず同じ型のインスタンスかでテストを書いてみます。

実行すると失敗しました。

java.lang.AssertionError:
Expected: sameInstance(“dummy”)
but: was “foo bar”

同じインスタンス(ポインタが同じ)かどうかのチェックなんですね。
以下のように変更したところテストは成功しました。

anythingのサンプル

何でもtrueになるMatcherです。モックを利用しているけど、全ての振る舞いを制御できていない時等には
これでお茶を濁すなんて手もたまにやります。

nullValueとnotNullValueのサンプル

nullValueはnullチェックです。notNullValueも字面通り非nullチェックです。

hasItemのサンプル

特に迷うこともないと思います。

hasItemsのサンプル

これについても特に問題ないと思います。

containsStringのサンプル

bothのサンプル

中学校の英語の授業で習ったboth A and Bですね。

bothはallOfで書き換えられますので、allOfで同じチェックを追加してみます。

bothはandで条件をつなげていかないといけないので、どうしても括弧が多くなりがちですのでallOfの方が私的にはオススメです。

eitherもbothと記述方法としては同じです。こちらもanyOfで書き換えできます。


スポンサードリンク



関連記事

Eclipseのインストールと日本語化とJDK8(Java8)対応[Eclipse4.4とEclipse4.3]

インストールするEclipseのバージョンですが、とりあえず4.3をターゲットとしておき、 4.4

記事を読む

Eclipse4.4(Java)における自動ビルド設定の変更方法の説明

Eclipse4.4における自動ビルド設定の変更方法を説明させていただきます。 自動ビルド設定の変

記事を読む

JUnit入門その1[Eclipse4.4のJUnitプラグインの基本的な使い方]

利用する環境の作成につきましては、「Eclipseの使い方(Windows環境のEclipse4.3

記事を読む

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思っていたのですが、ついに作成してみ

記事を読む

「HyperSQL」の環境を作成し、Eclipseの「DBViewer」プラグインを利用してSQLを発行してみる

Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発

記事を読む

JUnit入門その7[Eclipse4.4のJUnitプラグインとDBUnitの併用(更新系のテストの実装)]

JUnit入門その6 ではDBUnitを便利に利用するためのユーティリティ(と言っても基底クラスで

記事を読む

Java超入門 with Eclipse[1:Eclipse環境の作成とEclipseの使い方の説明]

「JDT betaを利用してJDK8(java 8)対応のEclipse開発環境を作成する」では、最

記事を読む

JUnit入門その3[Eclipse4.4のJUnitプラグインとMockフレームワークのJMockitの併用の基本]

JUnit入門その3ではMockフレームワークのJMockitを利用したテスト環境の構築と使い方につ

記事を読む

Selenium入門その4[Selenium WebDriver(Java/Junit4)の基本コマンド]

前回はEclipse環境でSelenium WebDriverでJava/Junit4を利用したテス

記事を読む

Java8の新機能に完全対応のEclipseメジャーリリースとなる Eclipse 4.4 Luna (ルナ) が遂にリリース

Eclipse メジャーリリースとなる Eclipse 4.4 Luna (ルナ) が遂にリリースさ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にS

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようにな

Selenium入門その5[ページオブジェクトパターン(Page Object Design Pattern)を利用して変更に強いテストを作成する方法]

Selenium入門その2 では「UIマップファイル」と言う仕組みが

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思って

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑