【发布时间】:2011-02-21 03:39:27
【问题描述】:
我正在尝试实现一个 JUnit 测试来检查 DAO 的功能。 (DAO 将创建/读取基本的对象/表关系)。
我遇到的麻烦是 DAO(对于非测试代码)的持久性是通过使用 Spring/Hibernate 的内部解决方案完成的,这消除了通常的 @987654321我发现的大多数示例都包含@templates。
因此,我在理解如何设置 JUnit 测试以实现 DAO 以创建/读取(只是非常基本的功能)到内存中 HSQLDB 时遇到了一些麻烦。我找到了一些示例,但内部持久性的使用意味着我无法扩展示例显示的某些类(我似乎无法正确设置 application-context.xml)。
谁能建议我可以查看的任何项目/示例(或任何文档),以进一步了解实现此测试功能的最佳方法?我觉得这应该很简单,但是在实现我发现的示例时我一直遇到问题。
编辑:
这是我的解决方案以提高可读性,适合任何需要帮助的人:
-
我的
TestClass:@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml") @Transactional public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests { @Resource(name = "sessionFactory") private SessionFactory exampleSessionFactory; @Resource(name = "exampleDao") private ExampleDao exampleDao; -
我的
applicationContext.xml文件:<!-- List of Daos to be tested --> <bean id="exampleDao" class="org.myExample.ExampleDao"/> <!-- Datasource --> <bean id="example_dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc:hsqldb:mem:ExampleTest"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean> <!-- Session Factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="example_dataSource"/> <property name="annotatedClasses"> <list> <value>org.myExample.ExampleClass</value> </list> </property> <property name="hibernateProperties"> .... left to user to choose properties </property> </bean>
【问题讨论】:
-
一些附加信息:我对 Spring/Hibernate 的配置不太熟悉,直到现在我已经在以前的项目中配置了它们。我当前的项目是配置的混搭,我无法弄清楚我所指的“内部”类是如何获得其会话工厂的。所有的 DAO 都对其进行了扩展(一个抽象类),其中包含一个抽象声明: public abstract SessionFactory getSessionFactory();我无法弄清楚“getSessionFactory()”方法的来源。我认为它必须以某种方式由 Spring 注入,但我找不到任何这样做的配置文件。
-
谢谢大家,你们都很有帮助。对于未来的人:我将我的 applicationContext-Test.xml 文件包含在我的单元测试中(通过 Willie 指定的 @ContextConfiguration)我在其中定义了 HSQLDB 数据源、会话工厂、事务管理器和作为 beans
。我的测试类注释为:@RunWith(SpringJUnit4ClassRunner.class)、@ContextConfiguration(locations = "your appContext.xml") @Transactional,并且我的会话工厂和 dao 被注释为资源(来自 .xml defs):@Resource( name = "sessionFactory")
标签: java hibernate spring junit hsqldb