1

Jukitoを使用してDaoをモックしようとすると、次の例外が発生します。

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at org.jukito.JukitoModule.addKeyDependency(JukitoModule.java:338)
    at org.jukito.JukitoModule.addInjectionPointDependencies(JukitoModule.java:330)
    at org.jukito.JukitoModule.addDependencies(JukitoModule.java:313)

私がモックしようとしているオブジェクトはConcreteDaoです。

public class ConcreteDao extends AbstractDao<MyDomain> {
}

public abstract class AbstractDao<T extends DatastoreObject> {
}

このバインディングジェネリックに関するSOに関するいくつかの投稿を読みましたが、バインディングに使用する方法がわかりませんTypeLiteral

これは私が試したものです:

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(ConcreteDao.class);
4

1 に答える 1

3

次のようにバインドする必要があります。

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(new TypeLiteral<ConcreteDao<MyDomain>>(){});

これは、ジェネリック クラスを取得する方法です。

class AbstractDao {
  protected final Class<T> clazz;

  @Inject
  public AbstractDao(TypeLiteral<T> type) {
    clazz = (Class<T>) type.getRawType();
  }
}

のサブクラスは、AbstractDaoエンティティ固有TypeLiteralの を親クラス ( AbstractDao)に渡す必要があります。

class ConcreteDao extends AbstractDao<MyDomain> {
  @Inject
  public ConcreteDao(TypeLiteral<MyDomain> type) {
    super(type);
  }
}

AbstractDao クラスを非抽象化し、基本的な CRUD 操作を実装できることに注意してください。これにより、AbstractDaoエンティティごとに拡張する必要なく使用できます。次のように、エンティティごとにバインディングが必要です。

bind(new TypeLiteral<GenericDao<User>>(){}).in(Scopes.SINGLETON);

詳細については、私のブログ投稿を参照してください。

于 2012-07-26T10:12:59.877 に答える