JMockitでMock作成
HelloWorldテストで組み込みの型(PrintStream)のMockを作成しようとして、いまいち上手くできない感じで有ったが、そもそもそれが目的ではないのでとりあえずHelloWorldのPrintStream部分を普通のクラスに変えてみた。
tutorial/HelloWorld.java
package tutorial; public class HelloWorld { public static void main( String av[] ) { DummyStream.println("Hello World"); } }
tutorial/DummyStream.java
package tutorial; public class DummyStream { static public void println( String str ) { System.out.println(str); } static public void someOtherMethod( String str ) { System.out.println(str); } }
これでMockで偽装したいのは普通のクラスなのでテストコードはこんな風に理想的に書ける
package tutorial; import static org.junit.Assert.*; import mockit.*; import org.junit.After; import org.junit.Test; public class HelloWorldTest2 { static public class MockPrintStream { public void print(String str) { assertEquals(str,"Hello World"); } } @Test public void testMain() throws Exception { Mockit.redefineMethods(DummyStream.class, MockPrintStream.class); HelloWorld.main(null); } @After public void tearDown() { Mockit.tearDownMocks(); } }
ターゲットクラスから呼び出されるメソッドと同じシグネチャのメソッドだけを用意したクラスを、"本当のクラスの振りして"とお願い( redefineMethod部分 )するだけ!Mockを使ったテスト。。。。なにコレ?楽チン。
JMockit最強!
ちょっとTIPS:@Afterで Mockit.tearDownMocks(); を呼び出すのはお約束のようだ。