Hibernate类的Mock对象

时间:2013-04-07 15:09:47

标签: java testing mocking easymock

是否有可能为Hiberate的本机类制作Mock对象(我使用easymock)?例如查询?如果是的话,我应该怎么做?

以下是测试代码的一部分:

@Mock
 private SessionFactory sessionFactory;

 @Mock
 protected Session session;

 @Mock
 protected Query query;

 @Before
 public void setUp() {
***
  pageService.setQuery(query);
  pageService.setSession(session);
 }

String hqlUniquenessCheck - it is a select request
  expect(sessionFactory.getCurrentSession().createQuery(hqlUniquenessCheck)).andReturn(query);

但是在线预期***我得到了java.lang.NullPointerException。 什么可能是错的?

非常感谢提前。

1 个答案:

答案 0 :(得分:3)

Hibernate类不是本机类。您可以像应用程序中的任何其他类一样模拟hibernate类。

本机类是具有native java关键字的类。这意味着它们包含的字节码不是java代码。所有hibernate的代码都是java代码,可以从hibernate.org获得。 (如果您使用的是maven,则可以使用-DdownloadSources=true,或在IDE中设置等效设置。这将显示库的源代码。)请注意,您无需拥有源代码即可嘲笑对象。

Query是一个接口,因此您可以像使用框架一样使用任何其他接口来模拟它。查看框架的文档:

http://www.betgenius.com/mockobjects.pdf

修改

值得注意的是,hibernate确实在运行时为持久对象生成代理。您会在这些代理的类名中看到类似$$EnhancerByCGLIB的内容。这些代理具有本机代码,您不应该尝试嘲笑它们。不要试图从会话中模拟真正的持久对象,而是模拟Session,它本身就是一个接口,模拟Query,并从查询结果中创建自己的模拟对象。