0

私は単純なクラスをテストしようとしています:

public class GenericDAO {

    @Autowired
    protected SessionFactory sessionFactory;

    public <T> Serializable create(final T o) {
        return sessionFactory.getCurrentSession().save(o);
    }

    @SuppressWarnings("unchecked")
    public <T> T find(final Class<T> cl, final long id) {
        return (T) sessionFactory.getCurrentSession().get(cl, id);
    }

    @SuppressWarnings("unchecked")
    public <T> T update(final T o) {
        return (T) sessionFactory.getCurrentSession().merge(o);
    }

    public <T> void delete(final T o) {
        sessionFactory.getCurrentSession().delete(o);
    }

    @SuppressWarnings("unchecked")
    public <T> List<T> getAll(final Class<T> cl) {
        return (List<T>) sessionFactory.getCurrentSession()
                .createCriteria(cl).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }
}

私のテストクラスでは、 @Before を使用してセッションを作成し、テスト用のデータベースに入力します。次のようになります。

    @Autowired
    protected SessionFactory sessionFactory;    

    @Before
    public void setUp() {
        Session session = sessionFactory.getCurrentSession();
        session.save(user);
        session.save(user1);
        session.save(user2);
        session.flush();
        // Otherwise the query returns the existing order 
        session.clear();
    }

私にとっては、 @BeforeClass を使用して db を埋める方が良いです。これは、クラスの開始時にテスト日を 1 回だけ作成する必要があるためです。ただし、このメソッドは静的でなければならないため、sessionFactory をオートワイヤーできません。それで、これに対する最善の解決策は何ですか?

4

1 に答える 1

1

この問題に対する私の解決策は、DataSourceすべてのメソッド呼び出しを実際のデータ ソースに転送するように実装することです。

から接続が要求されるとDataSource、それが最初の接続かどうかを確認します (ブール値のフラグのみ)。そうであれば、接続を返す前にデータベースをセットアップします。

擬似コード:

getConnection() {
    conn = delegate.getConnection()
    if( firstConnection ) {
        firstConnection = false;
        setupDatabase( conn );
    }
    return conn;
}

これにより、DB セットアップも遅延します。

注: あなたのコードは、すべきでない多くのものをテストします: Hibernate、JDBC、DB ドライバー、データベース。一般に、これらの部分は機能するか、他の誰かによってテストされていると想定する必要があります。

ほとんどのテストではGenericDAO .

于 2013-02-26T08:40:27.393 に答える