*

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

公開日: : 最終更新日:2015/05/02 Eclipse, Java, JUnit ,


スポンサードリンク



クラスに関する基礎知識シリーズも、いよいよメソッドを残すのみとなりました。
前回までは、Eclipseのデバッグ機能を用いて実際の動作を見ていただいてきましたが、
今回からは「JUnit」も利用して行きますので、まずは、「JUnit」のザクザクっとした説明をさせていただき、
その後にメソッドの説明との流れとなります。

本エントリーの内容は以下のようになります。

  1. 「JUnit」の説明
  2. メソッドの説明

 

1 JUnitの説明

JUnit入門

「JUnit」とは、Javaでユニット(単体)テストを実装するためのオープンソースのフレームワークです。
「JUnit」は、大別すると以下の2つの機能から成り立っています。

  • Javaで作成したロジックに対するユニットテストを実装するためのAPI
  • 実装したユニットテストを実行し、その結果を表示するテストランナー

Java超入門では、既にEclipseの環境を構築済みですので、JUnitも利用できる状態にあります。

JUnitで簡単なテストを実装してみる

細かい説明をするよりも、実際にJUnitを使いながら、利用方法を説明させていただいた方が分かりやすいと思います。

Taiyakiのテストの作成方法

パッケージ・エクスプローラーでTaiyaki.javaを選択し、右クリックメニューを表示します。
表示されたメニューの[新規]>[junitテスト・ケース]をクリックします。
スクリーンショット 2014-05-16 14.09.53

新規JUnitテスト・ケースの作成画面が表示されました。
この画面では以下の項目が指定可能です。

  • テストケースが格納されるソースフォルダ
  • パッケージ
  • テストクラスの名前
  • スーパークラス
  • テスト元クラス(テスト対象クラス)
  • メソッド・スタブ
  • コメント

テスト元クラス選択状態で本画面が表示された場合には、必要な項目はデフォルトがセットされています。
名前はテスト元クラス+”Test”がデフォルトとなります。

メソッド・スタブのsetUpBeforeClass、tearDownAfterClass、Setup、TearDownは後ほど説明しますので、全てチェックし、「次へ>」ボタンをクリックしてください。
スクリーンショット 2014-05-16 14.50.32

画面は以下のようになります。この画面では、テスト元クラスとスーパークラスのテスト可能なメソッドが一覧表示されています。
スクリーンショット 2014-05-16 14.54.05

テスト可能とは、前回説明させていただいたアクセス識別子に依存します。
例えば、Taiyakiにはprivateなswimメソッドが存在していますが、この一覧には表示されていません。

結局テスト可能なのは2つのコンストラクタだけですので、この2つをチェックして、「完了」ボタンをクリックしてください。
スクリーンショット 2014-05-16 14.59.39

最後に、利用しているプロジェクトがJUnitのjarファイルを参照していない場合は、以下の画面が表示されますので「OK」ボタンをクリッックしてください。
スクリーンショット 2014-05-16 15.00.27

これでTaiyakiTest.javaが作成されました。

JUnitで指定可能なアノテーション

ファイルの説明の前にアノテーションの説明をさせていただきます。
アノテーションとは、「あるデータに対して関連する情報(メタデータ)を注釈として付与すること」を意味します。
クラス、変数、メソッドに付与することができます。

簡単に言い換えると、「これがテストメソッドだよ」、「これがテスト実行前に実行されるメソッドだよ」
みたいな物です。現実世界では付箋が一番近いと思います。付箋に「これがテストメソッドだよ!」と書いてメソッドに貼る。そんなイメージです。

JUnitで利用可能なアノテーションは以下の通りです。

アノテーション 説明
@Test テストメソッド
@Before 全てのテストメソッド実行前に行われる処理、テストランナー実行時に1回のみ実行
@After 全てのテストメソッド実行後に行われる処理、テストランナー実行時に1回のみ実行
@BeforeClass @Testで指定されたテスト実行前に1度だけ行われる処理
@AfterClass @Testで指定されたテスト実行後に1度だけ行われる処理

 

作成されたファイルの説明

説明するほどの内容は無いので、System.out.printlnで各メソッドの説明を出力するようにしました。

TaiyakiTestでは、@Testアノテーションが付与されているのは、testTaiyakiInt、testTaiyakiの両メソッドだけです。
これは、先ほどテストの作成時に選択した、テスト可能な2つのコンストラクタに対応しています。
testTaiyakiIntがintを引数にもつコンストラクタ、testTaiyakiが引数なしのコンストラクタのテストメソッドです。

これでまだ説明できていないのは、36行目と42行目の
fail(“まだ実装されていません”);
だけですね。

これは「JUnit」のAPIで、テストを失敗させたいときに呼び出すメソッドです。
えーーー!、failメソッドなんて何処にもないぞ!!、と思われるとおもいます。

これは、
import static org.junit.Assert.*;
に秘密があります。スタティックインポートを行うと、インポートしたクラスのメソッドがメソッド名だけで呼び出せるようになります。

引数の文字列はテスト失敗時に表示されます。実際にテストを実行するところでどのように表示されるか、注目してみてください。

Taiyakiのテストの実装

TaiyakiTestは作成できましたが、先ほど説明させていただいた通り、まだテストのテンプレートが作成されただけです。

・試しにテストを実行してみる
テスト実行のイメージをつかんでいただくためにテストを実行してみます。
エディタのTaiyakiTestを選択後に右クリックメニューを表示し、[実行]>[JUnitテストケース]をクリックしてください。
スクリーンショット 2014-05-16 15.13.39

結果は以下のようになりました。
スクリーンショット 2014-05-16 15.27.16

testTaiyakiIntとtestTaiyakiが両方とも失敗しています。
failを呼び出しているのだからまあ当然です。

1つめ(testTaiyaki)を選択してみたところ
java.lang.AssertionError: まだ実装されていません
と表示されています。テスト失敗時に表示するように指定した文字列ですね!
スクリーンショット 2014-05-16 15.29.00

・テストを実装してみる。
Taiyakiのint型のname1の値をコンストラクタで設定し、その値が正しい値かどうかを「JUnit」のassertEqualsを利用して検証するようにしてみます。

引数ありコンストラクタは、引数で渡された値をname1に、
引数なしコンストラクタは、100をname1にセットする。
との動作が正しいとの前提でテストを書き直してみました。

再度テストを実行してみます。
左上の画面にテストランナーが表示されていると思いますので
一番上の行を選んで、右クリックメニューを表示し[実行]をクリックしてください。
スクリーンショット 2014-05-16 18.10.57

実行できましたが、testTaiyakiもtestTaiyakiIntも失敗しました。
Taiyakiは何も変更していないので当然です。

testTaiyaki選択時の画面です。
スクリーンショット 2014-05-16 18.19.06

testTaiyakiInt選択時の画面
スクリーンショット 2014-05-16 18.21.37

・テストが成功するようにTaiyakiを修正する。
2つのコンストラクタを修正しました。

再度テストを実行してみます。
やりました!、オールグリーンです。
スクリーンショット 2014-05-16 18.31.44

メソッドの説明

メソッドの説明が終われば、いよいよクラスに関する基礎知識の説明は終わりです。

メソッドの定義方法

メソッドの定義方法は以下の通りです。

修飾子 戻り値 メソッド名(仮引数1の型 仮引数1の名前, 仮引数2の型 仮引数2の名前) {
メソッドの処理
}

仮引数は必要な数だけ定義します。仮引数が無しでもOKです。
これが基本パターンですが、可変長引数という物もあります。

戻り値には、void(戻り値無し)、プリミティブ型、任意のクラス等が指定可能です。

メソッドに付与可能な修飾子

メソッドに付与可能な修飾子は以下の通りです。

  • アクセス修飾子
  • スタティック修飾子
  • ファイナル修飾子
  • 抽象修飾子
  • ネイティブ修飾子
  • 同期修飾子
  • 厳密浮動小数修飾子

メソッド定義、利用時の注意点

メソッドを定義、利用する上での注意点は以下の2点です。

  • スタティック修飾子が付与されたメソッドは、付与されないメソッドと動作が異なる。
  • メソッドのプリミティブ型の仮引数は、メソッド内で値を変更しても呼び出しには反映されない。

・スタティック修飾子が付与されたメソッドの特徴
スタティック修飾子が付与されたメソッドはスタティックメソッドと呼ばれます。
スタティック修飾子が付与されないメソッドはインスタンスメソッドと呼ばれます。

スタティックメソッドからは、インスタンス変数にはアクセスできません。
スタティックメソッドからアクセスできるのはクラス変数だけとなります。

逆にインスタンスメソッドからはクラス変数とインスタンス変数の両方にアクセスできますが、
マルチスレッド環境で、複数スレッドがクラス変数を変更する場合は、スレッドセーフではなくなるので考慮が必要です。

Taiyakiにスタティックメソッドのjumpを追加しました。
中身が空なのでコンパイルエラーは発生していません。

jumpメソッドからインスタンス変数のname1にアクセスするコードを追加してみます。

予想通りコンパイルエラーが発生しました。
name1をstatic参照できないとのエラーメッセージです。
スクリーンショット 2014-05-15 17.58.41

では、クラス変数にアクセスするように変更してみます。

予想通りコンパイルエラーが無くなりました。
まだ、この説明で理解できない方も、スタティックメソッドの呼び出し方の説明を読んでいただければ理解できると思います。

・メソッドのプリミティブ型の仮引数は、メソッド内で値を変更しても呼び出しには反映されない。
論より証拠です。実際に動かして確認してみます。

Taiyakiに以下のメソッドを追加しました。
仮引数のargValueを受け取り、argValueをインクリメント(+1)するだけです。

funcSampleをTaiyakiCreatorから呼び出してみます。

追加した内容は
7行目でint型のローカル変数intValueを宣言し、値に77をセット
8行目でtaiyakiインスタンスのfuncSampleメソッドをintValueを引数に指定して呼び出し
となります。

8行目にブレークポイントを追加後にデバッグ実行を行って、実際にどうなるか確認します。

ブレークポイントの追加を以下の画像を見て行ってください。
スクリーンショット 2014-05-15 18.21.39

以下の画像の様に青い丸が表示されればOKです。
スクリーンショット 2014-05-15 18.25.49

デバッグ実行を開始します。
パッケジ・エクスプローラーでTaiyakiCreatorを選択後に右クリックメニューを表示後に、[デバッグ]>[Javaアプリケーション]をクリックします。
スクリーンショット 2014-05-15 18.28.22

パースペクティブの切り替え確認画面が表示された場合は「はい」をクリックします。
デバッグが開始しました。
スクリーンショット 2014-05-15 18.32.30

この時点でintValueは77であることが変数ビューから分かります。

funcSampleにステップ・インするために以下の画像の赤枠のボタンをクリックしてください。
スクリーンショット 2014-05-15 18.48.05

funcSampleにステップインできました。この時点でもargValueは77です。
スクリーンショット 2014-05-15 18.51.22

次は行を進めたいので、ステップ・オーバーです。
スクリーンショット 2014-05-15 18.53.23

一行進み、インクリメント処理が終わってargValueは78になりました。
スクリーンショット 2014-05-15 18.55.03

次はfuncSampleからTaiyakiCreatorに戻りたいのでステップ・リターンです。
スクリーンショット 2014-05-15 18.58.16

TaiyakiCreatorに戻ってきました。intValueは77のままです。
スクリーンショット 2014-05-15 19.00.12

長々と説明と画面を連ねましたが、プリミティブ型の引数は、メソッド内で値を変えても、メソッド呼び出し元の値は変わりません。
引数の値はメソッド呼び出し時に作成された一時的な値でしかないので注意してください。

逆に、参照型の変数は、メソッド内での処理結果がメソッド呼び出し元にも反映されます。

メソッドの呼び出し方法

先ほどから説明させていだていている通り、メソッドにはスタティックメソッドとインスタンスメソッドがあります。

スタティクメソッドの呼び出し方法

クラス.スタティックメソッド形式で呼び出します。(引数は省略しています)

実際にTaiyakiクラスのjumpメソッドをTaiyakiTestクラスに新しいテストメソッド:testJumpを追加して呼び出してみます。

Taiyakiクラスのクラスメンバname2はlong型なので初期値は0lです。jumpメソッドメソッド実行後のname2の値も検証してみました。

実行結果の画面は以下の通りです。
スクリーンショット 2014-05-16 19.41.22

testJumpメソッドを見ていただいて分かる通りですが、このコードにはTaiyakiクラスしか出現しません。
インスタンスが介在しないので、必然的にjump()メソッドからはインスタンス変数にアクセスはできません。

testJumpメソッドは以下のように書き換えることも可能です。
型 Taiyaki からの static メソッド jump() には static にアクセスする必要があります
との警告はされますが。

この呼び出しが可能なのは、インスタンスに対するクラスが一意(実際は継承があるのでそうでもない)に決まるので、
taiyaki.jump()と書いているけど、Taiyaki.jump()と間違えてるんだろ?

みたいにコンパイラが警告を出すだけで、このコードを許容しているだけですので、スタティックメソッドがインスタンスメンバにアクセスできる理由にはなりません。

とどめに、複数インスタンスからjumpメソッドを呼び出して値を確認してみます。
テストは通りました。結局はTaiyaki.jump()が3回呼ばれたことと同じですね。

インスタンスメソッドの呼び出し方法

これの例については、既に何度も例が出てきているので、今更感がありますが・・・、
呼び出したいメソッドを持つインスタンス.呼び出したいメソッド
の形式で呼び出します(引数は省略しています)

戻り値が存在するメソッドの例は今まで取り扱っておりませんので、戻り値で行きます。

Taiyakiクラスにrunメソッドを追加しました。引数のminutesを受け取り、minutes*50を返す意味不明なメソッドです。

TaiyakiTestクラスにテストメソッドのtestRunを追加してrunメソッドを呼び出してみました。

もちろんテストも成功しました。
スクリーンショット 2014-05-16 20.11.22

今度は、スタティックメソッドと同じように複数インスタンスを作成してrunメソッドを呼び出してみます。

と思ったのですが、runメソッドがメンバ変数を変更していないので、確認しても意味ないですので、
まずはrunメソッドでnum1(インスタンス)とnum2(スタティック)を変更します、
これでnum1とnum2の違いも鮮明になると思います。

testRunメソッドを以下のように変更しました。

testJumpが失敗するようになりますので、testRunだけ実行した結果は以下の通りです。
スクリーンショット 2014-05-16 21.35.26

メソッドの説明とは関係ないですが、クラス変数のname2は、taiyaki1.run(10)呼び出し時に500増加し
taiyaki2.run(50)呼び出し時に2500増加していることがこのテストが成功することから見て取れます。


スポンサードリンク



関連記事

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

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

記事を読む

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

EclipseのJUnitプラグインとDBUnitを併用したDB(データベース)のアクセス処理のユニ

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

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

Selenium入門その2 では「UIマップファイル」と言う仕組みが存在していることに言及させてい

記事を読む

Java超入門 with Eclipse[3:クラスに関する基礎知識(クラスとインスタンスとパッケージ)]

Javaといえば、「オブジェクト指向」とのイメージがとっても強いですよね。 そう、そうです。間違い

記事を読む

JUnit入門その9[@RunWithアノテーションを利用したテストの作成]

今回は@RunWithアノテーションを利用したテストの作成方法を説明させていただきます。 JU

記事を読む

JDK8(java 8)の新機能のラムダ式の利用方法[その3:java8が用意している関数型インターフェース]

[その2:関数型インターフェースを例としたラムダ式] と説明させていただいておりますが、

記事を読む

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

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

記事を読む

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 ↑