是否有可能为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。 什么可能是错的?
非常感谢提前。
答案 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
,并从查询结果中创建自己的模拟对象。