是否可以为 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);
但是在线 expect*** 我得到了 java.lang.NullPointerException。 有什么问题吗?
非常感谢。
最佳答案
Hibernate 类不是本地类。您可以模拟 hibernate 类,就像应用程序中的任何其他类一样。
native 类是具有 native
java 关键字的类。这意味着它们包含不是 java 代码的字节码。 hibernate 的所有代码都是 java 代码,可以从 hibernate.org 获得。 (如果您使用 Maven,您可以使用 -DdownloadSources=true
,或在您的 IDE 中设置等效设置。这将显示您的库的源代码。)请注意,您不需要拥有源代码以模拟对象。
Query
是一个接口(interface),因此您可以像使用框架的任何其他接口(interface)一样模拟它。查看框架的文档:
http://www.betgenius.com/mockobjects.pdf
编辑:
值得注意的是,hibernate 确实会在运行时为持久对象生成代理。您将在这些代理的类名中看到类似 $$EnhancerByCGLIB
的内容。这些代理确实有本地代码,您不应该尝试模拟它们。与其尝试从 session 中模拟一个真正的持久对象,不如模拟 Session
,它本身就是一个接口(interface),模拟 Query
,并从查询中创建您自己的模拟对象结果。
关于java - Hibernate 类的模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15863900/