Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EasyMock和Hibernate标准查询_Hibernate_Easymock - Fatal编程技术网

EasyMock和Hibernate标准查询

EasyMock和Hibernate标准查询,hibernate,easymock,Hibernate,Easymock,我正在尝试使用JUnit4和EasyMock 2.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 uniqu

我正在尝试使用JUnit4和EasyMock 2.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初始化mock criteria对象有关,但我对EasyMock和mock对象基本上是一个初学者,因此如果有人能看一下并告诉我需要做什么才能通过测试,我将不胜感激

非常感谢,, 标记

代码如下:

道方法 测试班
问题是,在模拟设置中传递到criteria.add的限制与在DAO级别传递的对象实例不完全相同

看看EasyMock的论点匹配器。您可以创建自己的参数匹配器,这可能会给您带来所需的灵活性,只需做一点工作

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

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);
}
}