MockMVC / Mock 说明与示例

只是简单介绍与说明,不喜勿喷,基本上这几个示例就够用了

导入依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

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

–> MockMVC 说明:

MockMvc 是springTest提供的对SpringMvc提供的测试工具。这样可以让单元测试不仅仅局限于对Dao和Service 层的测试。同时,也可以测试Controller层。丰富的单元测试的功能。测试时不用频繁重启servlet容器,简化了测试操作。
MockMvc需要ServletContext来**模拟用户的请求和响应**。
加载整个服务(包括数据库操作)

使用到的注解:

@RunWith(SpringRunner.class) 该注解为类级别批注,该注解的作用是告诉java这个类是以什么运行环境来运行
@SpringBootTest  启动spring容器,用来指定springboot应用程序的入口类,该注解会根据包名逐级向上查找,一直找到一个springboot的主程序为止,然后启动该类为单元测试准备spring上下文环境,参数是启动类的字节码文件
@Resource 注入所需资源(这里注入了Http请求所需要的参数列表)
@before的作用就是在一个类中最先执行的方法 
@after的作用就是在一个类中最后执行的方法

实现:

 * 1、mockMvc.perform执行一个请求。
 * 2、MockMvcRequestBuilders.get("XXX")构造一个请求。 或者 .post("xxx")
 * 3、ResultActions.param添加请求传值。 或者 .content("xxx")
 * 4、ResultActions.accept[əkˈsept] (MediaType.APPLICATION_JSON_UTF8_VALUE))设置返回类型
 * 5、ResultActions.andExpect添加执行完成后的断言。 (判断结果是否达到预期)
 * 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
 * 7、ResultActions.andReturn表示执行完成后返回相应的结果。

MockMVC 代码示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class xxxTest {

    private MockMvc mockMvc;
    //注入spring容器
    @Resource
    private WebApplicationContext context;

    @Before
    public void setUp() throws Exception {
        //初始化 MockMvc 对象
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        System.out.println("开始");
    }

    @After
    public void main() {
        System.out.println("结束");
    }

    @Test //有请求头、无参数的get请求
    public void testHello() throws Exception {
        ResultActions perform = mockMvc.perform(MockMvcRequestBuilders.get("/api/test")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE));

        perform.andExpect(MockMvcResultMatchers.status().isOk());
        perform.andExpect(MockMvcResultMatchers.content().string("0"));
        perform.andDo(MockMvcResultHandlers.print());
        MvcResult mvcResult = perform.andReturn();
    	System.out.println(mvcResult.getHandler());
        System.out.println(mvcResult.getRequest());
        System.out.println(mvcResult.getResponse());
        System.out.println(mvcResult.getInterceptors());
    }
    
    @Test  //有请求头、无参数的Post请求
    public void xxxApi() throws Exception {
        String jsonRequest = RequestJson.getJson();//请求是什么就组装什么参数

        ResultActions perform = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/xxxx")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .content(jsonRequest)
        );
        perform.andExpect(MockMvcResultMatchers.status().isOk());
        perform.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE));
        perform.andDo(MockMvcResultHandlers.print());
    }
    
    @Test  //有请求头、有参数的get请求
    public void test() throws Exception {

        ResultActions perform = mockMvc.perform(MockMvcRequestBuilders.post("/api/test")
                .param("test","test"));

        perform.andExpect(MockMvcResultMatchers.status().isOk());
        perform.andDo(MockMvcResultHandlers.print());
        MvcResult mvcResult = perform.andReturn();
        System.err.println(mvcResult.getHandler());
        System.err.println(mvcResult.getRequest());
        System.err.println(mvcResult.getResponse());
        System.err.println(mvcResult.getInterceptors());
    }

}

–> Mock 说明:

@RunWith(SpringRunner.class) 该注解为类级别批注,该注解的作用是告诉java这个类是以什么运行环境来运行
@Mock:创建一个Mock。
@InjectMocks:创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
java: @Autowird / @Resource 等方式完成自动注入。
在单元测试中,没有启动 spring 框架,此时就需要通过 @InjectMocks完成依赖注入。
@InjectMocks会将带有@Spy 和@Mock 注解的对象尝试注入到被 测试的目标类中。
Assertions: 断言

 * 是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。
 * assertEquals			判断两个对象或两个原始类型是否相等
 * assertNotEquals		判断两个对象或两个原始类型是否不相等
 * assertSame			判断两个对象引用是否指向同一个对象
 * assertNotSame		判断两个对象引用是否指向不同的对象
 * assertTrue			判断给定的布尔值是否为 
 * trueassertFalse		判断给定的布尔值是否为 
 * falseassertNull		判断给定的对象引用是否为 null
 * assertNotNull		判断给定的对象引用是否不为 null
 * assertThrows			判定调用某方法是否触发该异

Mock 代码示例:

例如:预置返回的结果(将 xxxRepository.save() 的返回值为 yy)
import static org.mockito.Mockito.when;
when(xxxRepository.save(Mockito.any())).thenReturn(yy);

例如:逻辑忽略(将 xxxServiceImpl.xxxation() 忽略,不执行)
import static org.mockito.Mockito.doNothing;
doNothing().when(xxxServiceImpl).xxxation(Mockito.anyString());

----------------------------------------
Mockito.any()  --> 参数
Mockito.anyString() --> 参数
@RunWith(SpringRunner.class)
public class xxxTest {

    @InjectMocks
    private xxxServiceImpl xxxServiceImpl;

    @Mock
    private xxxRepository xxxRepository;

    @Test
    public void testAll() {

        List<JSONObject> json = getJson();
        List<xxx> list = new ArrayList<xxx>();
        list.add(new xxx());
        when(xxxRepository.findByxxx(Mockito.any())).thenReturn(list);
        String s = xxxServiceImpl.xxxxxx(json);
        Assertions.assertNotNull(s);
    }
    
    @Test
     public void testAll() {
        List<xxx> xxx= xxxxServiceImpl.xxxxx(参数结构);
        Assertions.assertEquals(1, xxxResults.size());//断言
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值