是一个不依赖于测试框架(JUnit等)的测试环境,也是注解驱动的。(2.5版本后引入)
位于org.springframework.test.context包中。
@ContextConfiguration(locations = {"/com/apress/prospring2/ch22/dataaccess/applicationContext-dataaccess.xml", "/com/apress/prospring2/ch22/services/applicationContext-services.xml"})
定义在类上的注解,定义context。//或者使用classpath:的方式指定路径
@Autowired注解用于按类型加载bean。或者俺名称加载@Resource(name="...")
@TransactionConfiguration(transactionManager = "myTransactionManager")
定义在类上的注解,定义transaction。可以忽略,就会寻找默认的bean名称transactionManager。还可以设置defaultRollback。
@BeforeTransaction与@AfterTransaction
方法上的注解。事务前后所运行的方法。
支持类:
还可以使用JUnit测试环境,而TestContext测试代码还是一样的。
JUnit 3.8提供了:AbstractTransactionalJUnit38SpringContextTests和AbstractJUnit38SpringContextTests。
JUnit 4提供了:AbstractTransactionalJUnit4SpringContextTests和AbstractJUnit4SpringContextTests
在上面的注解的基础上还可以使用一下注解:
1.@Repeat
被注解的方法被会重复测试多次。
@Repeat(10)
2.@Timed
希望测试在制定的时间内完成,ms
@Timed(millis = 5000)
3.@Rollback
@Rollback(true)会在测试方法执行完毕后对事务进行回滚,如果设置为false,那么事务会被提交,这样就无需使用setComplete()方法,增加了代码的可读性。
4.@NotTransactional
表示测试方法没有事务,方法不会运行在事务上下文中。
5.@ExpectedException
表示我们期望测试方法会抛出异常,期望的异常类以参数的形式传进来。
@ExpectedException(IllegalArgumentException.class)就是测试中会抛出这个异常,不然就不对。
6.@DirtiesContext
标识测试方法会在执行过程中改变Spring Context,就是执行方法结束后,Spring context会从配置文件中重新构建。
AbstractDependencyInjectionSpringContextTests的setDirty()方法也可以实现。
7.@IfProfileValue和@ProfileValueSourceConfiguration
检查提供的名字(来自配置好的ProfileValueSource)的返回值,如果值匹配就会执行测试,否则会忽略掉测试。
默认ProfileValueSource是SystemProfileValueSource,否则使用@ProfileValueSourceConfiguration指定。
demo:
位于org.springframework.test.context包中。
@ContextConfiguration(locations = {"/com/apress/prospring2/ch22/dataaccess/applicationContext-dataaccess.xml", "/com/apress/prospring2/ch22/services/applicationContext-services.xml"})
定义在类上的注解,定义context。//或者使用classpath:的方式指定路径
@Autowired注解用于按类型加载bean。或者俺名称加载@Resource(name="...")
@TransactionConfiguration(transactionManager = "myTransactionManager")
定义在类上的注解,定义transaction。可以忽略,就会寻找默认的bean名称transactionManager。还可以设置defaultRollback。
@BeforeTransaction与@AfterTransaction
方法上的注解。事务前后所运行的方法。
支持类:
还可以使用JUnit测试环境,而TestContext测试代码还是一样的。
JUnit 3.8提供了:AbstractTransactionalJUnit38SpringContextTests和AbstractJUnit38SpringContextTests。
JUnit 4提供了:AbstractTransactionalJUnit4SpringContextTests和AbstractJUnit4SpringContextTests
在上面的注解的基础上还可以使用一下注解:
1.@Repeat
被注解的方法被会重复测试多次。
@Repeat(10)
2.@Timed
希望测试在制定的时间内完成,ms
@Timed(millis = 5000)
3.@Rollback
@Rollback(true)会在测试方法执行完毕后对事务进行回滚,如果设置为false,那么事务会被提交,这样就无需使用setComplete()方法,增加了代码的可读性。
4.@NotTransactional
表示测试方法没有事务,方法不会运行在事务上下文中。
5.@ExpectedException
表示我们期望测试方法会抛出异常,期望的异常类以参数的形式传进来。
@ExpectedException(IllegalArgumentException.class)就是测试中会抛出这个异常,不然就不对。
6.@DirtiesContext
标识测试方法会在执行过程中改变Spring Context,就是执行方法结束后,Spring context会从配置文件中重新构建。
AbstractDependencyInjectionSpringContextTests的setDirty()方法也可以实现。
7.@IfProfileValue和@ProfileValueSourceConfiguration
检查提供的名字(来自配置好的ProfileValueSource)的返回值,如果值匹配就会执行测试,否则会忽略掉测试。
默认ProfileValueSource是SystemProfileValueSource,否则使用@ProfileValueSourceConfiguration指定。
demo:
- @ContextConfiguration(locations = {"/com/apress/prospring2/ch22/dataaccess/applicationContext-dataaccess.xml","/com/apress/prospring2/ch22/services/applicationContext-services.xml"})
- @TransactionConfiguration(transactionManager ="myTransactionManager")
- publicclassDefaultUserServiceIntegrationTestsextendsAbstractTransactionalJUnit38SpringContextTests {
- protectedUserService userService;
- publicDefaultUserServiceIntegrationTests() {
- }
- @AfterTransaction
- publicvoidcheckDatabaseState() {
- assertEquals("No users should be saved in this test",0,this.userService.findAllUsers().size());
- }
- @Repeat(10)
- @Timed(millis =5000)
- @ExpectedException(IllegalArgumentException.class)
- publicvoidtestRegister()throwsException {
- System.out.println("done");
- User user =newUser();
- user.setUsername("jonhs");
- user.setPassword("hTy86dj");
- userService.register(user);
- assertNotNull("User not saved!", user.getId());
- User user2 =newUser();
- user2.setUsername("jonhs");
- user2.setPassword("fGC467");
- userService.register(user2);
- }
- @ExpectedException(IllegalArgumentException.class)
- publicvoidtestRegisterIncorrectPassword()throwsException {
- User user3 =newUser();
- user3.setUsername("jandD");
- user3.setPassword("fgh85");
- userService.register(user3);
- }
- @Autowired(required =false)
- publicvoidsetUserService(UserService userService) {
- this.userService = userService;
- }
- @Autowired(required =false)
- publicvoidsetDataSource(DataSource dataSource) {
- super.setDataSource(dataSource);
- }
- }