先日、Expectationsを使ったMockのレコーディングで
コンストラクタの処理がMockできないということを書きました。
JMockitを使用してみる - nemuzukaの「明日から本気出す」
いろいろいじってたらできましたー。
@MockField(methods={"doSomething"})
を
@MockField(methods={"<init>","doSomething"})
にするか、
@MockField
でよかったみたいです。ふぅ。
で、動作確認の為にサンプルクラスを作成しました。
Mock対象クラス Dependency
package jp.co.nemuzuka; import java.util.Date; public class Dependency { /** * コンストラクタ. */ public Dependency() { throw new RuntimeException("だめだー"); } /** * コンストラクタ. */ public Dependency(String string) { throw new RuntimeException("やだ"); } /** * コンストラクタ. */ public Dependency(Date param) { throw new RuntimeException("作らせん!"); } /** * Mock対象メソッド. */ public String getData(String data, String data2) { return "引数は" + data + "と" + data2 + "ですね"; } }
どのコンストラクタを使用してもExceptionがthrowされるにくい奴です。
で、テストクラス TargetExpectationsTest
package jp.co.nemuzuka; import java.util.Date; import mockit.Expectations; import mockit.MockField; import org.junit.After; import org.junit.Test; import static mockit.Mockit.tearDownMocks; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; public class TargetExpectationsTest { @After public void tearDown() { tearDownMocks(); } @Test public void testCase1() { //Expectationsを使用して操作を記録 new Expectations(true) { @MockField Dependency mockDependency; { //最初の呼び出し用のMockの振る舞い new Dependency(); mockDependency.getData("",""); returns("Dependency#Dependency()をMock"); //次の呼び出し用のMockの振る舞い //※withNotNullはnullでなければ何でも良い new Dependency((Date) withNotNull()); mockDependency.getData((String) withNotNull(), (String) withNotNull()); returns("Dependency#Dependency(Date)をMock"); //次の呼び出し用のMockの振る舞い new Dependency("おほほー"); mockDependency.getData((String) withNotNull(), (String) withNotNull()); returns("Dependency#Dependency(String)をMock"); } }; //テスト対象クラスのインスタンスを生成(引数無しのコンストラクタ) Dependency target = new Dependency(); assertThat(target.getData("",""), is("Dependency#Dependency()をMock")); //テスト対象クラスのインスタンスを生成(引数Dateのコンストラクタ) target = new Dependency(new Date()); assertThat(target.getData("ひげ","abc"), is("Dependency#Dependency(Date)をMock")); //テスト対象クラスのインスタンスを生成(引数Dateのコンストラクタ) target = new Dependency("おほほー"); assertThat(target.getData("hige","あいう"), is("Dependency#Dependency(String)をMock")); } }
インスタンスが生成できないのに、テストできちゃいました。
(JVMの引数におまじないとして -javaagent:jmockit.jar が必要です)
うん、楽チン。