Spring提供的单元测试

本文介绍了如何在Spring项目中进行单元测试,重点讲解了Spring提供的@RunWith、@SpringApplicationConfiguration、@ContextConfiguration、@WebAppConfiguration、@Transactional和@Rollback注解的用途,以及如何利用Mock进行测试。通过这些工具,开发者可以在测试环境中轻松管理事务并模拟依赖对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用传统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添加执行完成后的断言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值