springBoot整合 mockmvc

一、简介

https://blog.csdn.net/wltsysterm/article/details/79578850
为何使用MockMvc?

对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,
所以为了可以对Controller进行测试,我们引入了MockMVC。 MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,
而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,
即独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。

二、springBoot整合 mockmvc

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

 

import javax.naming.InvalidNameException;

import org.junit.Assert;
import org.junit.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("包名")
public class ApplicationTest{

    public static void main(String[] args) throws Exception {
        
        SpringApplication.run(ApplicationTest.class,args);
    }
}

 

//SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.class
@RunWith(SpringRunner.class)
//SpringBoot1.4版本之前用的是@SpringApplicationConfiguration(classes = Application.class)
@SpringBootTest(classes = {ApplicationTest.class},webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT ) 
@AutoConfigureMockMvc
public class xxxControllerTest {
    @Autowired
    XXXController xxxController;
       
    @Autowired
    protected MockMvc mockMvc;
      
    如果测试的数据不确定,要保证可以准确测试逻辑并且多次运行,所有每次测得时候在数据库手动插数据,但是依旧不能把测试数据保存在数据库
    用普通的JDBC是不行的,@Transactional这个注解有时是会失效的,自己理解应该是Spring声明式事物管理的范围内对数据库操作都是可以进行rollback的。
    @Autowired
    public DataSource dataSource;
    
    @Test
    @Transactional
    @Rollback(value = true)
    public void testXXX() throws Exception{
        
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
        jdbcTemplate.update("insert into XXXX");
...//构造需要的参数

MvcResult mrcresult = mockMvc.perform( MockMvcRequestBuilders.post("/XXX")//测试的API .contentType(MediaType.APPLICATION_JSON_UTF8) .content(JsonToObjectUtil.objToJson(xxx))//需要的参数 ) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.jsonPath("responseCode").value("000")) .andReturn(); } }

 

posted @ 2020-04-22 11:50  向日葵呀  阅读(924)  评论(0)    收藏  举报