*

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の使い方(Eclipse4.4のブックマーク機能とタスク機能)

今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。 両機能とも効率的

記事を読む

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

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

記事を読む

Java超入門 with Eclipse[2:プリミティブ型(基本データ型)とは]

他のプログラミング言語と同様に、Javaにもデータ型が存在します。 Java超入門の第2回では、プ

記事を読む

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

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

記事を読む

Java超入門 with Eclipse[5:クラスに関する基礎知識(メソッドをJUnitを使って説明)]

クラスに関する基礎知識シリーズも、いよいよメソッドを残すのみとなりました。 前回までは、Eclip

記事を読む

java8(JDK8)の新機能[大幅に強化されたコレクションAPI:java.util.List] をeclipseとJUnitで確認する。

Java8(JDK8)では、ラムダ式の導入を前提とした、コレクションAPIの新機能が追加されました。

記事を読む

EclipseでAndroidアプリケーションの開発環境の構築と”Hello World!”まで

対象のOSはMac(OS X 1.9.5)とWindows7 64bitとなります。 といっても手

記事を読む

JDK8(java 8)の新機能のラムダ式の利用方法[その1:概要]

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

記事を読む

Eclipseの「DBViewer」プラグインの使い方[前編]

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

記事を読む

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

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

記事を読む

Message

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

Eclipse Oxygen Update 1 (4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。

いよいよJUnit5が本格的に利用できる環境が整ってきました。

Spring5入門[簡単なWebアプリのユニットテストをJUnit5とJMockitで作成]

Spring5入門ではJUnit4とmockitを利用したSpring

Spring5入門[STS(Spring Tool Suite)で簡単なWebアプリの典型的なユニットテストの実現方法]

前回は「Spring入門」で、Spring MVCを利用した簡単なWe

Spring5入門[STS(Spring Tool Suite)の環境作成と簡単なWebアプリの作成]

Struts1ももう過去の遺物になり、SAStrutsもEOLとなりも

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

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

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑