久しぶりにEasyMockで単体試験を書いたら、toString()をmockれないと知った。

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

最近、久しぶりにコードを書いている。
やはり、プロジェクト管理をやるよりこっちの方が良いな。楽しい。

さて、今久々にJUnit書いてて、EasyMock使ってるんだが、
最近のEasyMockさんがtoString()メソッドをmockしてくれないことを知った。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

著者/訳者:渡辺 修司

出版社:技術評論社( 2012-11-21 )

定価:

Amazon価格:¥ 3,564

単行本(ソフトカバー) ( 480 ページ )

ISBN-10 : 477415377X

ISBN-13 : 9784774153773




まず久しぶりなので準備。
EasyMock(http://www.easymock.org/)からEasyMockとClassExtensionを入手。
次に関連するobjenesis(http://code.google.com/p/objenesis/)と
javassist(http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/)と
cglib(http://cglib.sourceforge.net/)をゲット。

JUnit(http://junit.org/)もゲット。最近はMavenで落とせって書いてあるけど、俺は古い人間なのでjar探して落とす。
junitとhamcrest-core両方を探して落とす。

で、試験開始。こんな風なクラスがあるとする。

  1. package org.tarotaro.java;
  2. public class MockSample {
  3.     @Override
  4.     public String toString() {
  5.         return "real-toString()";
  6.     }
  7.     public String anotherMethod() {
  8.         return "real anotherMethod()";
  9.     }
  10.     public String toStringCaller(MockSample s) {
  11.         return s.toString() + " is OK!";
  12.     }
  13.     public String anotherMethodCaller(MockSample s) {
  14.         return s.anotherMethod() + " is OK!";      
  15.     }
  16. }

これをテストする、こんなJUnitコードを書く。System.out.printlnとか使ってるが気にしないで。
とりあえず、toStringCallerとanotherMethodCallerを手っ取り早く呼んだ上で出力を見たかったので。

  1. package org.tarotaro.java;
  2. import org.easymock.EasyMock;
  3. import org.junit.Test;
  4. public class JUnitSample {
  5.     @Test
  6.     public void testToString() {
  7.         MockSample sample = EasyMock.createMock(MockSample.class);
  8.         EasyMock.expect(sample.toString()).andReturn("easy-mock");
  9.         EasyMock.expect(sample.anotherMethod()).andReturn("another-method-mock");
  10.         EasyMock.replay(sample);
  11.         MockSample real = new MockSample();
  12.         System.out.println(real.toStringCaller(sample));
  13.         System.out.println(real.anotherMethodCaller(sample));
  14.     }
  15. }

で、実行するとこうなる。

  1. java.lang.IllegalStateException: no last call on a mock available
  2.     at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:520)
  3.     at org.easymock.EasyMock.expect(EasyMock.java:498)
  4.     at org.tarotaro.java.JUnitSample.testToString(JUnitSample.java:8)
  5. ・・・

調べてみると、この辺りこの辺りに、
EasyMockはtoString()をmockか出来ないとか書いてある。本当かどうかよくわからんが、事実としてtoString()呼び出し辺りを消すと動く。
これ、地味に困るな・・・。

ところで、最近はどういう単体テスト技法が流行ってるのかな?もうJUnitなんて古いのかなー。
EasyMockなんて古いのかなー。わからんあ。

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

フォローする

スポンサーリンク
スポンサーリンク