在使用传统Junit做单元测试时,一个明显的不足就是在Junit中不能对使用注解的类进行注入,而一旦我们项目使用Spring的话,必然会有大量的使用注解进行注入的情况,此时传统的Junit几乎是废的。为了解决这个问题,Spring框架为我们提供了spring-test专门解决这种问题。
Spring单元测试依赖的Jar
除了Spring基础jar和Junit的Jar之外,还需要导入spring-test.jar包。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
使用Spring提供的单元测试,需要在原来普通的Junit的Test类中加入几个特殊的注解即可。
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class AbstractTests {
}
@RunWith注解指定测试类运行的环境:
JUnit允许⽤用户指定其它的单元测试执⾏行类,只需要我们的测试执 ⾏行类继承类org.junit.runners.BlockJUnit4ClassRunner就可以 了,Spring的执⾏行类SpringJUnit4ClassRunner就是继承了该类。通 过注解@RunWith(SpringJUnit4ClassRunner.class)即可使⽤用该注解.
@SpringApplicationConfiguration(classes = Application.class)
或者
@ContextConfiguration("classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class AbstractTests {
}
@SpringApplicationConfiguration与@ContextConfiguration注解是用来加载Spring的配置。在使用Spring Boot这种微框架的时候即通过@SpringApplicationConfiguration来标识启动类,而对于存在Spring的配置文件的项目则使用@ContextConfiguration注解来指定配置文件。
@WebAppConfiguration
加载Spring上下⽂文,在Web中Spring上下文是通过一个监听器来加载的。该注解就是在测试类中加载Spring 上下⽂。
Spring单元测试框架提供的事务管理
Spring提供的单元测试中可以很方便的让测试方法运行在一个事务环境,而且还能设置该事务运行完成后是否进行回滚。
@Test
@Transactional
@Rollback(false)
public void testTransaction(){
@Transactional
/** *测试事务。单元测试中默认事务只会Rollback⽽而不
会Commit,但设置@Rollback(false)则会Commit */
accountService.account("yx","wx");
}
如上代码所示,@Transactional注解使得测试类运行在事务中,而@Rollback(false)用来标志该事务是否进行回滚。设置为false则会进行回滚。
Spring单元测试框架提供的Mock
什么是Mock Objects
• 允许你测试依赖于其它对象的⽅方法,但那个对象⾮非常难实例化或是
太慢如资源类的等。
• 要测试控制器中的请求,但又不需要通过浏览器来完成,则可以 通过Mock。
下⾯我们根据具体的代码来利用Mock实现上述的例⼦子。
@Autowired
WebApplicationContext wac;
@Autowired
public MockHttpServletRequest mockRequest;
@Autowired
public CustomerService customerService;
private MockMvc mockMvc;
@Before
public void getMockForWeb(){
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testCustomer() throws Exception{
MvcResult result = this.mockMvc.perform(MockMvcRequestBuilders.get("/customer").
param("param_key","param_value").param("param_key","param_value")).
andDo(MockMvcResultHandlers.print()).
andReturn();
Assert.assertNotNull(result.getModelAndView());
}
解析:
mockMvc.perform 执行一个请求
MockMVCRequestBuilders.get(“URL”) 构造一个请求get或者post自己指定
ResultActions.andDo添加一个结果处理器,表示对结果做点什么事情,MockMvcResultHandlers.print()表示输出整个响应信息。
ResultActions.andReturn表示执行完后返回相应的结果。
另外,ResultActions.andException添加执行完成后的断言。