Java Hibernate的模拟对象';s类
是否可以为Hibrate的本机类创建模拟对象(我使用easymock)?例如查询?如果是,我应该怎么做 以下是测试代码的一部分:Java Hibernate的模拟对象';s类,java,testing,mocking,easymock,Java,Testing,Mocking,Easymock,是否可以为Hibrate的本机类创建模拟对象(我使用easymock)?例如查询?如果是,我应该怎么做 以下是测试代码的一部分: @Mock private SessionFactory sessionFactory; @Mock protected Session session; @Mock protected Query query; @Before public void setUp() { *** pageService.setQuery(query); p
@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。
有什么不对劲
非常感谢。Hibernate类不是本机类。您可以模拟hibernate类,就像应用程序中的任何其他类一样 本机类是具有
Native
java关键字的类。这意味着它们包含的字节码不是java代码。hibernate的所有代码都是java代码,可从hibernate.org获得。(如果您使用的是maven,则可以使用-DdownloadSources=true
,或在IDE中设置等效设置。这将显示库的源代码。)请注意,模拟对象不需要源代码
Query
是一个接口,因此您可以使用该框架模拟它,就像模拟任何其他接口一样。查看框架的文档:
编辑:
值得注意的是,hibernate确实在运行时为持久对象生成代理。您将在这些代理的类名中看到类似于
$$enhancerbyglib
的内容。这些代理确实有本机代码,您不应该试图模拟它们。与其试图从会话中模拟真实的持久对象,不如模拟会话,它本身就是一个接口,模拟查询,并根据查询结果创建自己的模拟对象。Hibernate类不是本机类。您可以模拟hibernate类,就像应用程序中的任何其他类一样
本机类是具有Native
java关键字的类。这意味着它们包含的字节码不是java代码。hibernate的所有代码都是java代码,可从hibernate.org获得。(如果您使用的是maven,则可以使用-DdownloadSources=true
,或在IDE中设置等效设置。这将显示库的源代码。)请注意,模拟对象不需要源代码
Query
是一个接口,因此您可以使用该框架模拟它,就像模拟任何其他接口一样。查看框架的文档:
编辑:
值得注意的是,hibernate确实在运行时为持久对象生成代理。您将在这些代理的类名中看到类似于$$enhancerbyglib
的内容。这些代理确实有本机代码,您不应该试图模拟它们。不要试图从会话中模拟真正的持久对象,而是模拟本身是接口的会话
,模拟查询
,并根据查询结果创建自己的模拟对象。您以前试过模拟接口吗?没什么不同。三思而后行!IMHO模拟JPA完全是浪费时间。在我问你之前,我一直在尝试这样做,但我失败了,我听说模拟本地组件可能会有一些问题,可能会有一些特殊性。别急着说我没试过。我不知道本机组件是什么。你是说具体的类(不是接口)吗。2.你尝试了什么代码,什么失败了(把它放在你的问题中)。你以前试过模拟接口吗?没什么不同。三思而后行!IMHO模拟JPA完全是浪费时间。在我问你之前,我一直在尝试这样做,但我失败了,我听说模拟本地组件可能会有一些问题,可能会有一些特殊性。别急着说我没试过。我不知道本机组件是什么。你是说具体的类(不是接口)吗。2.你尝试了什么代码,失败了什么(把它放在你的问题中)。