零XML配置測試Spring&Hibernate應用
我很熱衷于在編譯器和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原創翻譯/原文鏈接
本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!