2010-05-18 115 views
17

我正在尝试实施JUnit测试以检查DAO的功能。 (DAO将创建/读取一个基本的对象/表关系)。Spring/Hibernate/Junit测试DAO对HSQLDB的示例

时遇到的问题是正在通过使用弹簧一个内部溶液完成DAO的持久性(对于非测试代码)/休眠,这消除了通常*.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> 
    
+0

一些额外的信息:我不是太与configur经历Spring/Hibernate,我已经在之前的项目中配置过它们。 我目前的项目是一个混杂的配置,我无法弄清楚我提到的“内部”类如何获得它的会话工厂。所有DAO扩展它(一个抽象类),并且内部是一个抽象声明: public abstract SessionFactory getSessionFactory(); 我找不出“getSessionFactory()”方法来自哪里。我认为它必须由Spring以某种方式注入,但我找不到任何配置文件。 – 2010-05-19 05:04:15

+0

谢谢你们,你们都很有帮助。 对于那些未来的人: 我将我的applicationContext-Test.xml文件包含到我的单元测试中(通过@ContextConfiguration作为Willie指定的),其中我将HSQLDB数据源,会话工厂,事务管理器和Daos定义为bean 。我的测试类的注释为:@RunWith(SpringJUnit4ClassRunner.class), @ContextConfiguration(locations =“your appContext.xml”) @Transactional,我的会话工厂&dao注释为资源(来自.xml defs):@资源(名称=“sessionFactory”) – 2010-05-19 22:27:34

回答

5

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框架。测试可以是这样的(同样我假设低于春季3,但它应该在Spring 2.5的工作只是通过改变@Inject到@Autowired):

@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字段。

这只是做什么的大纲,但希望它足以让你开始。

1

与Hibernate的底线是SessionFactory - 您的内部解决方案将最有可能以某种方式创建的其中之一。了解如何,然后添加一个bean,以相同的方式在测试应用上下文中创建一个bean(或者如果可能,使用您在运行时使用的内部代码)。您可能需要创建自己的FactoryBean来进行实例化。 (使用AbstractFactoryBean作为您的基类。)

一旦这个到位,使用LocalSessionFactoryBean的大多数示例都可以迁移到您的情况 - 而不是使用LocalsessionFactoryBean,请使用您的自定义工厂Bean。

(如果你不这样做的话,看在春天参考Testing部分 - 它使测试与Spring,和注射用测试从上下文豆微风)

2

See here。它假定maven2是构建工具,但您可以轻松使用任何东西。

+0

@downvoter - 是因为我链接到我的博客? – Bozho 2010-06-04 14:12:08

0

我的应用程序上下文看起来有点不同

<beans:bean class="org.apache.commons.dbcp.BasicDataSource" id="HSQL_DS"> 
    <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
    <beans:property name="url" value="jdbc:hsqldb:mem:Test"/> 
    <beans:property name="username" value="sa"/> 
    <beans:property name="password" value=""/> 
</beans:bean> 
<jdbc:embedded-database id="HSQL_DS"> 
    <jdbc:script location="classpath:schema.sql"/> 
    <jdbc:script location="classpath:data.sql"/> 
</jdbc:embedded-database> 

和我的测试类是这样的:

public class Tester { 

    private EmbeddedDatabase db; 

    @Before 
    public void setUp(){ 
     db = new EmbeddedDatabaseBuilder().addDefaultScripts().build(); 


    } 

    @Test 
    public void TestMe(){ 
     System.out.println("Testing"); 
    } 


    @After 
    public void tearDown(){ 

     db.shutdown(); 
    } 
}