2

JUnit4とEasyMock2.4を使用して、Hibernate基準APIを使用するdaoメソッドをテストしようとしています。

テストフィクスチャ'testGetAsset'を実行すると、次の例外が発生します。

java.lang.AssertionError:   
Unexpected method call add(name=Test):
   add(name=Test): expected: 1, actual: 0
   add(source=GSFP): expected: 1, actual: 0  
   uniqueResult(): expected: 1, actual: 0  
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:32)  
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:61)  
at $Proxy7.add(Unknown Source)  
at com.hsbc.sfd.funddb.persistence.dao.AssetDaoImpl.getAsset(AssetDaoImpl.java:80)  
at com.hsbc.sfd.funddb.persistence.AssetDaoTest.testGetAsset(AssetDaoTest.java:62)  

問題はAsset.classで初期化されていないモック基準オブジェクトに関連していると思いますが、私は一般的にEasyMockとモックオブジェクトの初心者なので、誰かが見てくれて教えてくれたら本当にありがたいですテストに合格するために私がしなければならないこと。

どうもありがとう、マーク

コードは以下のとおりです。

ダオ法

public Asset getAsset(String name, Source source) {
    return (Asset) this.sessionFactory.getCurrentSession()
            .createCriteria(Asset.class)
            .add(Restrictions.eq("name", name))
            .add(Restrictions.eq("source", source))
            .uniqueResult();
}

テストクラス

public class AssetDaoTest {

private SessionFactory factory;
private Session session;
private Criteria criteria;

private AssetDaoImpl dao;


@Before
public void setUp() {
    factory = createMock(SessionFactory.class);
    session = createMock(Session.class);
    criteria = createMock(Criteria.class);

    dao = new AssetDaoImpl();
    dao.setSessionFactory(factory);
}

@Test
public void testGetAsset() {

    String name = "Test";
    Source source = Source.GSFP;

    Asset asset = new Asset();
    asset.setName(name);
    asset.setSource(source);

    expect(factory.getCurrentSession()).andReturn(session);
    expect(session.createCriteria(Asset.class)).andReturn(criteria);
    expect(criteria.add(Restrictions.eq("name", name))).andReturn(criteria);
    expect(criteria.add(Restrictions.eq("source", source))).andReturn(criteria);
    expect(criteria.uniqueResult()).andReturn(asset);

    replay(factory, session, criteria);

    dao.getAsset(name, source);
}
}
4

1 に答える 1

3

問題は、モック セットアップで criteria.add に渡す制限が、DAO レベルで渡されるオブジェクト インスタンスとまったく同じではないことです。

EasyMock の引数マッチャーを見てみましょう。ちょっとした作業で、探している柔軟性を提供する独自の引数マッチャーを作成できます。

ここで実際に何をテストしているのかを考える価値があるかもしれません。Hibernate で DAO をテストする良い方法は、Hibernate 基準 API をモックアウトするのではなく、HSQL などを使用してデータベースをモックすることです。次に、いくつかのサンプル データをインメモリ データベースにロードし、DAO が正しく動作していることを確認します。

于 2009-02-11T06:21:03.410 に答える