我非常热衷于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