我正在尝试使用 JUnit4 和 EasyMock 2.4 来测试使用 hibernate criteria 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);
}
}
最佳答案
问题在于,您在模拟设置中传递到 criteria.add 的限制与在 DAO 级别传递的对象实例并不完全相同。
看看 EasyMock 的参数匹配器。您可以创建自己的参数匹配器,这可能会为您提供所需的灵活性,但只需做一些工作。
可能值得考虑一下您在这里真正测试的内容。使用 Hibernate 测试 DAO 的一个好方法是使用 HSQL 之类的东西来模拟数据库,而不是尝试模拟 Hibernate 标准 API。然后,您可以将一些示例数据加载到内存数据库中,并确保您的 DAO 运行正常。
关于hibernate - EasyMock 和 Hibernate 标准查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/462592/