针对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作为构建工具,但您可以轻松使用任何东西。
我最近在一些代码中使用Hibernate , Spring和HSQLDB实现了类似的解决方案。
值得注意的是,现在已经弃用了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(); } }
- Hibernate Criteria和多个join
- 如何使用Hibernate映射MySQL DATE’EMA’&TIME ’00:00:00′
- Hibernate分页机制
- java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index;
- 在hibernate中缺少@Temporal注释
- 使用hibernate与数据库连接时出错
- Hibernate Sequence Id Specification
- 分离对象如何在hibernate状态下工作
- 如何为AbstractRoutingDataSource安全频繁的DataSource切换?