2013-04-07 53 views
0

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

下面是测试代码部分:

@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。 什么可能是错的?

非常感谢提前。

+2

你之前试过嘲笑一个界面吗?没有太大的不同。 **尝试之前,你问!**恕我直言嘲笑JPA是一个完整的浪费,如果时间。 – 2013-04-07 15:24:32

+0

在我问你之前,我一直在努力做到这一点,但是我失败了,我听说嘲笑本机组件可能会有一些麻烦,并且可能会有一些特殊之处。不要急着说我没有尝试。 – Anastasiya 2013-04-07 15:35:02

+0

1.我不知道本机组件是什么。你的意思是具体的类(即不是一个接口)。 2.你尝试了什么代码并且失败了(把它写在你的问题中)。 – 2013-04-07 16:33:41

回答

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,并从查询结果中创建您自己的模拟对象。