在没有XML的情况下测试Spring和Hibernate

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

不过,这里有一些细节值得注意:

  1. 我将测试标记为@Transactional ,以便可以直接访问Session 。 在这种情况下, @EnableTransactionManagement@Configuration似乎在测试被包裹在交易反正没有任何效果。
  2. 如果测试未标记为@Transactional (仅使用@Transactional组件,则是明智的选择),则无论@TransactionConfiguration设置如何,似乎总是提交事务。
  3. 如果测试标记为@Transactional ,则默认情况下似乎会应用@TransactionConfiguration 。 即使省略了该事务,该事务也将在测试结束时回滚,并且如果要提交它,则需要@TransactionConfiguration(defaultRollback=false)
  4. 这可能不言而喻,但是用于测试的@Configuration可能与生产环境不同。 在这里,它使用嵌入式H2数据库,对于实际应用程序,我将在与生产相同的引擎上使用测试数据库。

就这样,仅是这两个Java类。 没有XML或扭曲的行为。 查看我的github存储库以获取完整的代码。

参考:我们的JCG合作伙伴 Konrad Garus在Squirrel的博客上测试了没有XML的Spring和Hibernate


翻译自: https://www.javacodegeeks.com/2012/08/testing-spring-hibernate-without-xml.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值