java - Hibernate 类的模拟对象

标签 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);

但是在线 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/

相关文章:

java - 计算多元正态分布的概率

java - Spring Bean 复制属性忽略子对象的空值

java - 下载 apk,没有这样的文件或目录错误..

jquery - jquery.simulate.js 和 jQuery 事件方法之间的区别?

javascript - 测试库错误 : mockConstructor(. ..):渲染没有返回任何内容

json - Spring 3.1.2中带有JAXB批注的注册器MappingJackson2HttpMessageConverter

java - 响应中的 Apache HttpClient header 问题

python - 寻找 Python Web 应用程序项目的测试/QA 想法

python - 如何提交仅给出 HTML 源的表单?

ruby-on-rails - 如何在 rspec 中模拟数据库查询响应以根据响应测试其他方法