2

を にバインドしようとしていますが、適切なClass<? extends SuperClass>ものSubClass.classが見つかりません。

実際、バインディングは にある必要があるSet<Class<? extends SuperClass>>ため、通常のバインディングとマルチバインディングの両方をテストしましたが、いずれも適切に動作させることができません。私はこの質問に正しく従ったと思います: Guice を使用して、境界付きワイルドカード クラスを挿入するにはどうすればよいですか? しかし、私のテストは合格していないので、私にはよくわかりません。

import static java.util.Collections.*;
import static org.junit.Assert.*;
import java.util.Set;
import org.junit.Test;
import com.google.inject.*;
import com.google.inject.multibindings.Multibinder;

public class GuiceWildcardTest {

    @Test public void binderShouldBindClassWithWildcard() {
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                bind(new TypeLiteral<Class<? extends SuperClass>>() {}).toInstance(SubClass.class);
                ClassHolder holder = new ClassHolder();
                requestInjection(holder);
                assertEquals(SubClass.class, holder.type);
            }
        });
    }

    @Test public void multibinderShouldBindSetOfClassesWithWildcard() {
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                Multibinder.newSetBinder(binder(), new TypeLiteral<Class<? extends SuperClass>>() {}).addBinding().toInstance(SubClass.class);
                SetHolder holder = new SetHolder();
                requestInjection(holder);
                assertEquals(singleton(SubClass.class), holder.types);
            }
        });
    }

    static class SuperClass {}

    static class SubClass extends SuperClass {}

    static class ClassHolder {
        @Inject Class<? extends SuperClass> type;
    }

    static class SetHolder {
        @Inject Set<Class<? extends SuperClass>> types;
    }
}
4

1 に答える 1

1

私の問題は、インジェクターが完成するのを待たなかったことです。requestInjection()はトリックを行いますが、が作成されたInjectorであるため、 への呼び出しの直後ではありませんrequestInjection()

このコードは機能します:

import static java.util.Collections.*;
import static org.junit.Assert.*;

import java.util.Set;

import org.junit.Test;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.TypeLiteral;
import com.google.inject.multibindings.Multibinder;

public class GuiceWildcardTest {

    @Test public void binderShouldBindClassWithWildcard() {
        final ClassHolder holder = new ClassHolder();
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                bind(new TypeLiteral<Class<? extends SuperClass>>() {}).toInstance(SubClass.class);
                requestInjection(holder);
            }
        });
        assertEquals(SubClass.class, holder.type);
    }

    @Test public void multibinderShouldBindSetOfClassesWithWildcard() {
        final SetHolder holder = new SetHolder();
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                Multibinder.newSetBinder(binder(), new TypeLiteral<Class<? extends SuperClass>>() {}).addBinding().toInstance(SubClass.class);
                requestInjection(holder);
            }
        });
        assertEquals(singleton(SubClass.class), holder.types);
    }

    static class SuperClass {}

    static class SubClass extends SuperClass {}

    static class ClassHolder {
        @Inject Class<? extends SuperClass> type;
    }

    static class SetHolder {
        @Inject Set<Class<? extends SuperClass>> types;
    }
}
于 2012-08-01T10:13:42.850 に答える