零XML配置测试Spring&Hibernate应用
openkk
12年前
我很热衷于在编译器和IDE的支持下通过移除XML文件来提升Spring3的开发效率,而这并不会改变Spring给你提供的强大的功能。
没有XML配置文件的Hibernate的单元测试是可行的,但是竟然花了我好一会才找到所有的东西,所以就在这里写下来。
我将在一个使用@Configuration注解的类中初始化所有的bean。
@Configuration @EnableTransactionManagement public class TestRepositoryConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) .setName("Nuts").build(); } @Bean public LocalSessionFactoryBean sessionFactoryBean() { LocalSessionFactoryBean result = new LocalSessionFactoryBean(); result.setDataSource(dataSource()); result.setPackagesToScan(new String[] { "pl.squirrel.testnoxml.entity" }); Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); result.setHibernateProperties(properties); return result; } @Bean public SessionFactory sessionFactory() { return sessionFactoryBean().getObject(); } @Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager man = new HibernateTransactionManager(); man.setSessionFactory(sessionFactory()); return man; } @Bean public OrderRepository orderRepo() { return new OrderRepository(); } }测试类是这样的:
@RunWith(SpringJUnit4ClassRunner.class) @TransactionConfiguration(defaultRollback = true) @ContextConfiguration(classes = { TestRepositoryConfig.class }) @Transactional public class OrderRepositoryTest { @Autowired private OrderRepository repo; @Autowired private SessionFactory sessionFactory; @Test public void testPersistOrderWithItems() { Session s = sessionFactory.getCurrentSession(); Product chestnut = new Product("Chestnut", "2.50"); s.save(chestnut); Product hazelnut = new Product("Hazelnut", "5.59"); s.save(hazelnut); Order order = new Order(); order.addLine(chestnut, 20); order.addLine(hazelnut, 150); repo.saveOrder(order); s.flush(); Order persistent = (Order) s.createCriteria(Order.class).uniqueResult(); Assert.assertNotSame(0, persistent.getId()); Assert.assertEquals(new OrderLine(chestnut, 20), persistent .getOrderLines().get(0)); Assert.assertEquals(new OrderLine(hazelnut, 150), persistent .getOrderLines().get(1)); } }这里有几个需要注意的细节:
- 我在测试上使用了@Transactional注解,然后我将可以直接访问Session。
- 如果测试没有使用@Transactional注解,事务将总是忽略掉@TransactionConfiguration提交。
- 如果测试使用了@Transactional注解,@TransactionConfiguration将被视为默认配置。即使他被忽略了,在test执行最后的时候事务也将回滚,如果你想让他提交,就是用@TransactionConfiguration(defaultRollback=false).
- 对于不同的生产环境而言,测试的@Configuration可能都不同,我这里使用的是嵌入式的H2数据库,对于真实的应用我将在测试数据库上使用相同的引擎。
OSChina.NET原创翻译/原文链接