JUnitでJMockitを使ってみる

簡単なクラスを作成してJMockitの使い方をマスターします。

以下、mainクラスを持つクラスです。

普通に実行すれば、以下のように表示されます。

このクラスに対して以下テストクラスを作成します。

getAgeで10を返すのですが、テストクラスでJMockitを使用しメソッドをハックします。

戻り値を20に変えています。

これでテストを実行します。結果は以下のようになります。

JUnitでJMockitを使ってみる

このテストに使ったライブラリは以下です。

junit-4.12.jar

jmockit-1.8.jar

プロシージャの戻り値をモックする

次にJavaからプロシージャを呼び出し、その戻り値をモックしてみます。

CallableStatementをモックする場合はDBUnitを使用しないとモックできないようです。

以下、Javaからプロシージャを呼び出す例です。

このJavaでプロシージャの戻り値をcs.getInt()で取得していますが、これをモックします。

参考:JMockitでプロシージャ戻り値のモック

これでモックにより-1を返すようにします。が、実際はモックできません。かなり悩みましたがどうやらCallableStatementのようなojdbcのクラスはDBUnitが必要なようです。(ググっても見つかりませんでしたが、、多分そのはず、、だれか詳しい方教えてください)

ということでDBUnitのライブラリをクラスパスに含めます。

dbunit-2.5.1.jar

slf4j-api-1.7.13.jar(DBUnitと依存関係にあるライブラリ)

slf4j-nop-1.7.13.jar(DBUnitと依存関係にあるライブラリ)

poi-3.14-20160307.jar(エクセルを使うため)

poi-ooxml-3.14-20160307.jar(エクセルを使うため)

xmlbeans-2.6.0.jar(DBUnitに依存?)

DBUnitを使うために抽象クラスを作成します。

まず、コネクションはDBUnit用のIDatabaseConnectionを使う必要があります。jdbcコネクションをラップします。

テストクラスはこの抽象クラスを継承します。
DBTestCaseクラスを継承せずにDBUnitを使用するには、データベーステスターを使用してみます。

テストクラスは上記の抽象クラスを継承します。

これでtest001を実行します。

「org.dbunit.dataset.NoSuchTableException: テーブル名」とエラーが出てしまいました。これもググって調べたのですが良くわからずとりあえず存在するテーブル名をエクセルのシートに書かないといけない?ようです。(誰か知ってたら教えてください)

ということでエクセルのシート名をsample_table(当方の環境で存在するテーブルです)にしました。

JUnitでJMockitを使ってみる

再度test001を実行すると上手くデバッグもとまるし、モックできるようになりました。

これで終わり、と思ったのですが、デバッグしていると以下のロジックでgetIntのモックに移動していました。

色々調べてみるとどうも内部的にgetIntやsetStringをしているようで、そこでモックしてしまっているようです。目的は戻り値をモックしたいので、テストクラスを以下のように変更します。

これでtest001を実行します。すると今度は「

mockit.internal.UnexpectedInvocation: Expected exactly 2 invocation(s) of TestProcTest$1#getInt(int i), but was invoked 3 time(s)」と出ました。

どうも3回呼ばれているようですがデバッグしていると以下で呼ばれていました。

ということでinvocations=3とします。getIntの戻り値は0にしたら上手くいきました。

関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
Python3.6,Djangoを勉強中です,Javaは少し飽きてしまってます–;
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくば、我に七難八苦を与えたまえ」です^^

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

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

CAPTCHA