CDIビーンを動的に取得するコードの単体テスト
やりたいこと
CDIビーンを動的に取得するコードについて書きました。
ksino.hatenablog.com
で、Weldなどを使わずに当該コードの単体テストをやりたいです。
実装
CDI関連クラスのモックを作る
CDIProviderクラスのモック
package jp.gr.java_conf.ksino.weldtest.logic.mock; import javax.enterprise.inject.spi.CDI; import javax.enterprise.inject.spi.CDIProvider; public class CDIProviderMock implements CDIProvider { @Override public CDI<Object> getCDI() { return new CDIMock(); } }
CDIクラスのモック
package jp.gr.java_conf.ksino.weldtest.logic.mock; import java.lang.annotation.Annotation; import java.util.Iterator; import javax.enterprise.inject.Instance; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.CDI; import javax.enterprise.util.TypeLiteral; public class CDIMock extends CDI<Object>{ @Override public Instance select(Class type, Annotation... antns) { return new InstanceMock(); } // その他のメソッドは省略
Instanceクラスのモック
package jp.gr.java_conf.ksino.weldtest.logic.mock; import java.lang.annotation.Annotation; import java.util.Iterator; import javax.enterprise.inject.Instance; import javax.enterprise.util.TypeLiteral; import jp.gr.java_conf.ksino.weldtest.cdibeans.Hero; import jp.gr.java_conf.ksino.weldtest.cdibeans.Superman; public class InstanceMock implements Instance<Hero> { @Override public Hero get() { return new Superman(); } // その他のメソッドは省略
テストコード
package jp.gr.java_conf.ksino.weldtest.logic; import javax.enterprise.inject.spi.CDI; import javax.enterprise.inject.spi.CDIProvider; import jp.gr.java_conf.ksino.weldtest.logic.mock.CDIProviderMock; public class LogicTest { @org.junit.Test public void testCall() { // CDIクラスにモックをセットする CDIProvider cdiProvider = new CDIProviderMock(); CDI.setCDIProvider(cdiProvider); Logic logic = new Logic(); logic.call(); } }