【问题标题】:EasyMock and Hibernate Criteria QueriesEasyMock 和 Hibernate 标准查询
【发布时间】:2009-01-20 18:55:55
【问题描述】:

我正在尝试使用 JUnit4 和 EasyMock 2.4 测试使用休眠标准 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);
}
}

【问题讨论】:

    标签: hibernate easymock


    【解决方案1】:

    问题在于,您在模拟设置中传递给 criteria.add 的限制与在 DAO 级别传递的对象实例并不完全相同。

    看看 EasyMock 的参数匹配器。您可以创建自己的参数匹配器,这可能会为您提供所需的灵活性,但需要做一些工作。

    可能值得考虑一下您在这里真正测试的是什么。使用 hibernate 测试 DAO 的一个好方法是使用 HSQL 之类的东西来模拟您的数据库,而不是尝试模拟 hibernate 标准 API。然后,您可以将一些示例数据加载到您的内存数据库中,并确保您的 DAO 行为正确。

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 2010-12-19
      • 2018-10-31
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多