spring 测试6

来源:互联网 发布:sqlserver数据库收缩 编辑:程序博客网 时间:2024/05/17 02:57
 

五、事务性单元测试

        到目前为止,你已看到了相对简单的JUnit测试—它仅发生在用mock对象支持的一个控制器的上下文中。但是,如果测试一个Web组件只有在一个 事务性上下文(例如,通过依赖性注入与Hibernate集成到一起)中才有意义的情况又会怎么样呢?不必担心,Spring MVC为JUnit框架提供了一个体面的扩展集合—它能准确地提供依赖性注入和事务安全测试(也就是,任何更新在测试完成后都将被回滚)。

测试步骤:

        让我们看一种假想的情形—你要实现一个组件(例如MyTransactionalController)测试,该组件运行在一个事务性的上下文中(也即,其方法调用的结果发生在一个事务内并且它应该在测试运行完后被回滚):

        1.创建一个定制的JUnit类(MyTransactionalControllerTest),它扩展了Spring的JUnit扩展类

AbstractTransactionalSpringContextTests:
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
public class MyTransactualControllerTest extends
AbstractTransactionalSpringContextTests {
public class.

        2.为了实现从Spring内置的单元测试中发现Spring管理的bean,你需要重载getConfigLocations()方法并且返回上下文文件位置的String数组,请看如下:

protected abstract String[] getConfigLocations(){
return new String[] {"classpath:/test/spring-context.xml"};
}

        3.拥有该类的一个测试属性及其相关联的getter和setter。由于 AbstractTransactionalSpringContextTests利用了auto-wiring(这是Spring框架的一个特性—能够 根据类属性的名字识别类依赖性并且用Spring bean填入相匹配的名字或ID)技术而且在测试时它将自动地解决类的依赖性问题,所以在Spring上下文文件中该类属性具有与Spring管理的 bean一样的名字并且在测试时每个属性都有一个适当命名的setter:

public MyTransactualController myTransactualController;
/**
* @返回myTransactualController。
*/
public MyTransactualController getMyTransactualController() {
return this.myTransactualController;
}
/**
*@参数myTransactualController。
*/
public void setMyTransactualController(
MyTransactualController myTransactualController) {
this.myTransactualController = myTransactualController;
}

        4.就象你通常操作“普通的”JUnit测试一样实现测试方法:

public void testCorrectBehavior() throws Exception{
//运行该事务性方法
myTransactualController.submitPayment( new Payment( 100 ) );
assertTrue( myTransactualController.isValid() );
}

        注意,你是在调用可能会更新数据库的方法submitPayment。Spring的JUnit扩展(AbstractTransactionalSpringContextTests)将在这个测试方法结束后实现自动回滚。

        5.如果你需要执行任何安装或清除任务,则可以重载AbstractTransactionalSpringContextTests的 onSetUpBeforeTransaction()或onSetUpInTransaction()方法。 AbstractTransactionalSpringContextTests将重载从TestCase继承来的setUp()和tearDown ()方法并且使其成为final类型。

六、小结

        至此,你已经学习了如何使用Spring单元测试框架和Web组件mock对象。通过使用这两个工具,你将会极大地提高你的Web组件的开发效率。

原创粉丝点击