开发者社区> 问答> 正文

零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数据库,对于真实的应用我将在测试数据库上使用相同的引擎。
大家也都看到了,仅仅就两个java类,没有XML。你可以通过这里查看我在Github上托管的 代码。你也可以完善它。

 

OSChina.NET原创翻译/原文链接

展开
收起
kun坤 2020-06-05 23:35:31 592 0
1 条回答
写回答
取消 提交回答
  • 事务管理,数据库之类的也用配置文件?######Spring非但提供了事务管理,还提供了 身份验证、控制访问、远程服务等等。。。至于用不用Spring的配置文件嘛,就另说了,肯定有人用嘛。。~~######对于需要大量地址和参数等配置的项目来说,用class代替xml纯找抽    玩玩还是可以的######为什么要无xml配置呢?本来改动不需要编译 现在改动需要编译会好点?######好######用javaconfig宣称无xml######如果是多人开发,还是有特定的xml为好,完全注解,只适合一人开发######这个用着简单,但不爽######annotation+xml结合用,还是很不错的,你这个略显蛋疼了,测试还OK######留着备用

    2020-06-05 23:35:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
移动互联网测试到质量的转变 立即下载
给ITer的技术实战进阶课-阿里CIO学院独家教材(四) 立即下载
F2etest — 多浏览器兼容性测试整体解决方案 立即下载