我非常热衷于Spring 3中的改进,这些改进最终使您能够在IDE和编译器的适当支持下从XML迁移到纯Java配置。
它并没有改变Spring是一个庞大的套件这一事实,并且有时发现您需要的东西可能需要一段时间。
围绕Hibernate的无XML单元测试就是这样一回事。 我知道这是有可能的,但是花了我超过5分钟的时间才能找到所有的碎片,所以我在这里写下来。
我将在@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
。 在这种情况下,@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