0

是否可以为 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。有什么问题?

提前谢谢了。

4

1 回答 1

3

Hibernate 类不是本地类。你可以模拟一个休眠类,就像你的应用程序中的任何其他类一样。

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

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

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

编辑:

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

于 2013-04-07T15:40:05.557 回答