「djUnit」タグアーカイブ

djUnitで強制的にExceptionを発生させる方法

djUnitではメソッドが呼び出された際、強制的に特定のExceptionを発生させる事も可能です。強制的にExceptionを発生させる場合には「addReturnValue」を使用します。
1点注意しておきたいのは「addReturnValue」を使用してExceptionを発生させた時はjunitで「@Test(expected = RuntimeException.class)」の様にアノテーションでは確認出来ないのでTry~catchで確認する必要があります。

Javaソース

djUnitサンプル

    以下のテストソースでは「URLEncoder」クラスの「encode」メソッドが呼び出された際に「UnsupportedEncodingException」がスローされた事を確認しています。

djUnitでaddReturnValueが効かない原因について

ちょっとdjUnitで「addReturnValue」を使用しても全く効いてない?という事象に少しハマっていたので原因についてメモしておきます。

addReturnValueが効かない原因

addReturnValueが効かない原因として上げられるのが概ね以下の3つになるかと思います。1と2については少し見なおせばすぐ発見出来そうですが、今回ハマった原因が3でした。。。

  1. クラス名の指定が間違っている
  2. メソッド名の指定が間違っている
  3. 指定したメソッドが複数回実行されている

「指定したメソッドが複数回実行されている」とは

では「指定したメソッドが複数回実行されている」というのはどういう事かというとについて説明します。
根本的な話として以下の2つのコードは全く同じ意味という事を理解しておく必要があります。

これだけで気づく方はハッと思うかもしれませんが、ここで重要なのはaddReturnValueでは「1回目に実行」されたメソッドのみしかaddReturnValueで指定した値が返ってこないという事です。つまり「setReturnValueAt」で1回目を指定した場合と同様の動きしかしてくれないのです。
今回私がハマったのは指定したメソッドが想定した箇所よりも手前で事前に実行されていた為、想定したいたメソッドは2回目の実行になっていたために2回目の方にはaddReturnValueが効いていなかったという事象でした。

addReturnValueが効かない時の調査方法

addReturnValueをしてクラス名やメソッド名は正しいのにどうも効いていないように見える時は一度「getCallCount」でメソッドの実行回数を調査して見ると良いかもしれません。

djUnitでメソッドが呼び出されていない事を確認する方法

djUnitではメソッドが呼び出されている事の確認は「assertCalled」を使用する事で確認出来ましたが、逆にメソッドを呼び出されていない事の確認では「assertNotCalled」を使用する事で確認出来ます。

Javaソース

djUnitサンプル

    以下のテストソースでは「getDiffDays」メソッドが呼び出されていない事を確認しています。

djUnitでメソッドが呼び出された事を確認する方法

djUnitではassertCalledを使用する事でメソッドが呼び出された事が確認出来ます。

Javaソース

djUnitサンプル

    以下のテストソースでは「htmlEscape」メソッドと「urlEncode」メソッドが呼び出されている事を確認しています。

複数回呼び出された時の確認方法

以下の様に「getCallCount」を使用する事でメソッドが何回呼び出されたかを確認する事も出来ます。

djUnitで戻り値なしのメソッドを無効化する方法

djUnitでテストする際に、一部のメソッドは特に実行する必要はないけどそのメソッドの処理はスルーさせたいケースがたまに発生します。こういう場合にはdjUnitのaddReturnValue機能を活用する事でそのメソッドの処理を無効化する事が出来ます。
通常addReturnValueはメソッドの戻り値を好みの値に変更する際に使用しますが、戻り値なし(void)のメソッドの時には通常使用しません。それでも戻り値なしのメソッドをaddReturnValueで指定するとそのメソッドが実行されずメソッドの処理を無効化する事が出来ます。
ただし、この方法は戻り値なし(void)のメソッドにしか活用出来ませんのでご注意下さい。

Javaソース

djUnitサンプル

コンソール

    addReturnValueを使用しないでテストした場合
    addReturnValueを使用してテストした場合

djUnitで複数回実行されるメソッドの返却値を変更する方法

djUnitでメソッドの返却値を好みのものに変更する場合は「addReturnValue」メソッドを使用しますが、
同一メソッドを複数回使用していてそれぞれ別々の戻り値に変更したい場合には「setReturnValueAt」メソッドを使用します。

Javaソース


djUnitサンプル

実行結果(コンソール)

djUnitでメソッドの返却値を好みのものに変更する方法

djUnitを使用する上での最大の利点と言っても良いのがVirtual Mock Objects(仮想モックオブジェクト)が使用出来る事です。
このVirtual Mock Objectsを使用すると作成したクラスでUtilクラスなどのメソッドを使用している場合、使用しているメソッドの戻り値を自由に変更する事が可能となります。
djUnitでメソッドの返却値を好みのものに変更する場合は「addReturnValue」メソッドを使用します。
「addReturnValue」メソッドの使用タイミングとしては、作成したクラスで使用している共通クラスのメソッドなどが未完成の場合でスタブが必要になるケースなどが考えられます。

Javaソース

djUnitサンプル

djUnitでのプライベートコンストラクタのテスト方法

javaではUtilクラスなどのコンストラクタは無駄なインスタンス化を抑制するためにコンストラクタの修飾子をprivateにする事がよくあります。ただdjUnitで試験する場合にはコンストラクタを呼び出したくても修飾子がprivateになっていてはインスタンス化が出来ずに呼び出せないのでカバレッジを100%に出来ません。そういう場合にプライベートコンストラクタをテストする方法についてメモしておきます。

Javaソース

JUnitサンプル

djUnitを実行してクラス名の行が未実行になる

基本的な事ですがjavaのテストでdjUnitを使用していると以下の様にクラス名を指定している行が未実行になってしまうという事がありました。
この原因と対応方法についてメモして置きます。

クラス名が未実行となる原因

  • コンストラクタが定義されていない。

対応方法

  • 以下の様にコンストラクタを定義します。

    未実行の箇所がクラス名の行からコンストラクタの行へ変化したのがわかります。後はコンストラクタ用のテストメソッドを記述すれば全て実行済となります。