2

単体テストを作成しようとしているタペストリー5 + hibernateアプリケーションがあります。この種のプロジェクトで DAO レイヤーをテストするためのガイダンスまたはベスト プラクティスを探しています。testng を使用して以下のテストケースを試しましたが、うまくいきませんでした。

@Test
public void createOrderTest() {
    IOCUtilities.buildDefaultRegistry();
    OrderManager orderManager = new OrderManager();
    Order o1 = new Order();
    Date date = new Date(System.currentTimeMillis());
    o1.setOrderDate(date);
    o1.setOrderStatus(OrderStatus.BILLED.toString());
    orderManager.createOrder(o1);
}

テスト ケースを実行しようとすると、エラー メッセージが表示されます。

java.lang.IllegalArgumentException: Contribution org.apache.tapestry5.yuicompressor.services.YuiCompressorModule.contributeMinimizers(MappedConfiguration) (at YuiCompressorModule.java:42) is for service 'interface org.apache.tapestry5.services.assets.ResourceMinimizer' qualified with marker annotations [interface org.apache.tapestry5.ioc.annotations.Primary], which does not exist.
at org.apache.tapestry5.ioc.internal.RegistryImpl.validateContributeDefs(RegistryImpl.java:246)
at org.apache.tapestry5.ioc.internal.RegistryImpl.<init>(RegistryImpl.java:205)
at org.apache.tapestry5.ioc.RegistryBuilder.build(RegistryBuilder.java:177)
at org.apache.tapestry5.ioc.IOCUtilities.buildDefaultRegistry(IOCUtilities.java:51)
at com.vc.xpressor.testng.OrderManagerTest.createOrderTest(OrderManagerTest.java:21)
4

2 に答える 2

5

DAO でコンストラクター インジェクションを使用する場合、DAO テストでタペストリーはまったく必要ありません。あなたの DAO が必要とする依存関係は、休止状態のセッションと、おそらくいくつかの @Symbols だけであるというのは正しいですか?

その場合、必要なのは、メモリ内データベース (h2 など) への接続をセットアップし、それを休止状態セッションでラップすることだけです。次に、hibernate セッションを DAO コンストラクターに渡します。

@Before メソッドで接続とセッションを設定する DAO の基本テスト クラスを使用します。

これがサンプルDAOです

public class ItemDAOImpl implements ItemDAO {
    private final Session session;

    public ItemDAOImpl(Session session) {
        this.session = session;
    }

    public List<Item> findAll() {
        return session.createCriteria(Item.class).list();
    }

    ....
}

Tapestry では、これは AppModule で宣言されています。

public static void bind(ServiceBinder binder) {
    binder.bind(ItemDAO.class, ItemDAOImpl.class);
}

しかし、私のテストケースでは、タペストリーは必要ありません

public class ItemDAOImplTest extends AbstractHibernateTest {
    private ItemDAO itemDAO;

    @Override
    protected void before() {
        itemDAO = new ItemDAOImpl(session);
    }

    @Override
    protected void after() {}

    @Test
    public void testFindAll() {
        session.save(new Item(...));
        session.save(new Item(...));
        session.save(new Item(...));
        assertEquals(3, itemDAO.findAll().size());
    }
}

public abstract class AbstractHibernateTest {
    protected SessionFactory sessionFactory;
    protected Session session;

    @Before
    public void abstractBefore() throws Exception {
        Configuration config = new Configuration();

        // see PackageNameHibernateConfigurer source code to dynamically add all
        // classes in the entities package
        config.addAnnotatedClass(Item.class);
        config.addAnnotatedClass(...);

        config.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        config.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
        config.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
        config.setProperty("hibernate.hbm2ddl.auto", "create");
        config.setProperty("hibernate.show_sql", "true");
        config.setProperty("hibernate.format_sql", "true");

        sessionFactory = config.buildSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        before();
    }

    protected abstract void before() throws Exception;

    @After
    public void abstractAfter() throws Exception {
        Exception exception = null;
        try {
            after();
        } catch (Exception e) {
            exception = e;
        }

        session.getTransaction().rollback();
        session.close();
        sessionFactory.close();

        if (exception != null) {
            throw exception;
        }
    }

    protected abstract void after() throws Exception;
}
于 2013-03-27T22:49:08.263 に答える
3

IoC 経由で DAO を実行する場合の別のオプションは、AppModule を 2 つに分割することです。1 つのモジュールは Hibernate エンティティと DAO を定義するために存在し、残りは AppModule にあります。DAOModule と HibernateCoreModule を使用してテストを初期化できます (お気付きの場合、Tapestry の Hibernate サポートも同様に 2 つに分割されています: tapestry-ioc の上で動作する非ビジュアル部分と、tapestry- に追加のフックを提供するビジュアル部分です)。芯)。

于 2013-03-29T17:12:57.597 に答える