我正在努力尝试实施JUnit测试以检查 DAO 的功能。 (DAO 将创建/读取基本的对象/表关系)。
我遇到的麻烦是 DAO(对于非测试代码)的持久性是通过内部解决方案完成的春季/休眠,这消除了通常的*.hbm.xml
我发现的大多数示例都包含模板。
因此,我在理解如何设置JUnit测试实现 DAO 以创建/读取(只是非常基本的功能)到内存中HSQLDB。我找到了一些示例,但是内部持久性的使用意味着我无法扩展示例中显示的某些类(我似乎无法正确获取 application-context.xml 设置)。
任何人都可以建议我可以查看的任何项目/示例(或任何文档),以进一步了解实现此测试功能的最佳方法吗?我觉得这应该非常简单,但在实现我找到的示例时我不断遇到问题。
edit:
对于任何需要帮助的人来说,这是我的解决方案,以提高可读性:
-
My 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;
-
My applicationContext.xml
file:
<!-- 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)的支持。这样就解决了那部分。
我想知道“内部解决方案”可能是什么。您可以使用注释(JPA 或 Hibernate 注释)来 ORM 您的域对象,那么为什么需要“内部解决方案”呢?例如。:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource"
p:packagesToScan="myapp.model" />
至于实现测试,请使用 Spring 的 TestContext 框架。测试可以如下所示(我再次假设下面是 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
field.
这只是要做的事情的概述,但希望它足以帮助您开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)