ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

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();
    }
}