针对HSQLDB测试DAO的Spring / Hibernate / Junit示例

我正在尝试实现一个JUnit测试来检查DAO的function。 (DAO将创建/读取基本对象/表关系)。

我遇到的麻烦是DAO的持久性(对于非测试代码)是通过使用Spring / Hibernate的内部解决方案完成的,这消除了我发现的大多数示例的常见*.hbm.xml模板包含。

因此,我在理解如何设置JUnit测试以实现DAO来创建/读取(只是非常基本的function)到内存中的HSQLDB时遇到了一些麻烦。 我找到了一些例子,但是内部持久性的使用意味着我无法扩展示例所显示的一些类(我似乎无法正确设置application-context.xml)。

任何人都可以建议我可以查看(或任何文档)的任何项目/示例,以进一步了解实现此测试function的最佳方法吗? 我觉得这应该很简单,但是我一直在遇到实现我发现的例子的问题。

编辑:

这是我的解决方案,为了更好的可读性,对于任何需要帮忙的人来说:

  • 我的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文件:

                   org.myExample.ExampleClass    .... left to user to choose properties   

Spring 3提供了一个新的jdbc命名空间,其中包括对嵌入式数据库的支持,包括HSQLDB。 因此,照顾那一部分。

我想知道“内部解决方案”可能是什么。 您可以使用注释(JPA或Hibernate注释)来ORM您的域对象,那么为什么需要“内部解决方案”? 例如:

  

就实现测试而言,使用Spring的TestContext Framework。 测试可以看起来像这样(我再次假设下面是Spring 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 。 (’它’代表集成测试,文件位于类路径上。)此示例中的控制器位于beans-web.xml ,并将自动装入ContactController字段。

这只是一个如何做的概述,但希望它足以让你开始。

看到这里 。 它假设maven2作为构建工具,但您可以轻松使用任何东西。

我最近在一些代码中使用HibernateSpringHSQLDB实现了类似的解决方案

值得注意的是,现在已经弃用了AbstractTransactionalJUnit4SpringContextTests – 但它仍然非常直接进行测试 – 我在这里详细介绍了大部分细节: http : //automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-层-with.html

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

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

(如果你还没有这样做,请查看spring参考中的Testing部分 – 它使用Spring进行测试,并从上下文中轻松地使用bean注入测试。)

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

           

我的测试类看起来像这样:

 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(); } }