我正在尝试实施 JUnit 测试以检查DAO的功能。(DAO将创建/读取基本的对象/表关系)。
我遇到的麻烦是DAO的持久性(对于非测试代码)是通过使用 Spring / Hibernate 的内部解决方案完成的,该解决方案消除了*.hbm.xml我发现的大多数示例所包含的常用模板。
*.hbm.xml
因此,我在理解如何设置 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 3提供了一个新的jdbc名称空间,其中包括对嵌入式数据库(包括HSQLDB)的支持。这样就可以解决这一部分。
jdbc
我想知道什么是“内部解决方案”。您可以使用批注(JPA或Hibernate批注)对您的域对象进行ORM,那么为什么需要“内部解决方案”?例如:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:packagesToScan="myapp.model" />
就实施测试而言,请使用Spring的TestContext Framework。测试看起来可能是这样的(再次假设我在下面的Spring 3中运行,尽管只需将@Inject更改为@Autowired即可在Spring 2.5中运行):
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "/beans-datasource-it.xml", "/beans-dao.xml", "/beans-service.xml", "/beans-web.xml" }) @Transactional public class ContactControllerIT { @Inject private ContactController controller; ... setUp() and tearDown() ... @Test public void testGetContact() { String viewName = controller.getContact(request, 1L, model); ... assertions ... } }
例如,您会将嵌入式数据库放入其中beans-datasource-it.xml。(这里的“ it”代表集成测试,文件位于类路径中。)本示例中的控制器位于中beans-web.xml,并将自动连接到该ContactController字段中。
beans-datasource-it.xml
beans-web.xml
ContactController
那只是做什么的概述,但希望足以让您入门。