我非常熱衷于Spring 3中的改進,這些改進最終使您能夠在IDE和編譯器的適當支持下從XML遷移到純Java配置。 它并沒有改變Spring是一個龐大的套件這一事實,并且有時發現您需要的東西可能需要一段時間。
圍繞Hibernate的無XML單元測試就是這樣一回事。 我知道這是有可能的,但是花了我超過5分鐘的時間才能找到所有的碎片,所以我在這里寫下來。
我將在@Configuration
類中初始化所有bean,如下所示:
@Configuration
@EnableTransactionManagement
public class TestRepositoryConfig {@Beanpublic DataSource dataSource() {return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).setName("Nuts").build();}@Beanpublic 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;}@Beanpublic SessionFactory sessionFactory() {return sessionFactoryBean().getObject();}@Beanpublic HibernateTransactionManager transactionManager() {HibernateTransactionManager man = new HibernateTransactionManager();man.setSessionFactory(sessionFactory());return man;}@Beanpublic OrderRepository orderRepo() {return new OrderRepository();}
}
…,我的測試如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback = true)
@ContextConfiguration(classes = { TestRepositoryConfig.class })
@Transactional
public class OrderRepositoryTest {@Autowiredprivate OrderRepository repo;@Autowiredprivate SessionFactory sessionFactory;@Testpublic 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
。 在這種情況下,@EnableTransactionManagement
上@Configuration
似乎在測試被包裹在交易反正沒有任何效果。 - 如果測試未標記為
@Transactional
(僅使用@Transactional
組件,則是明智的選擇),則無論@TransactionConfiguration
設置如何,似乎總是提交事務。 - 如果測試標記為
@Transactional
,則默認情況下似乎會應用@TransactionConfiguration
。 即使省略了該事務,該事務也將在測試結束時回滾,并且如果要提交它,則需要@TransactionConfiguration(defaultRollback=false)
。 - 這可能不言而喻,但是用于測試的
@Configuration
可能與生產環境不同。 在這里,它使用嵌入式H2數據庫,對于實際應用程序,我將在與生產相同的引擎上使用測試數據庫。
就這樣,僅是這兩個Java類。 沒有XML或扭曲的行為。 查看我的github存儲庫以獲取完整的代碼。
參考:我們的JCG合作伙伴 Konrad Garus在Squirrel的博客上測試了沒有XML的Spring和Hibernate 。
翻譯自: https://www.javacodegeeks.com/2012/08/testing-spring-hibernate-without-xml.html