详解Spring MVC如何测试Controller(使用springmvc mock测试)

2025-05-29 0 41

在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码。

1.什么是mock测试?

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

2.为什么要使用mock测试?

使用mock o bject进行测试,主要是用来模拟那些在应用中不容易构造(如httpservletrequest必须在servlet容器中才能构造出来)或者比较复杂的对象(如jdbc中的resultset对象)从而使测试顺利进行的工具。

3.常用注解

runwith(springjunit4classrunner.class): 表示使用spring test组件进行单元测试;

webappconfiguratio: 使用这个annotation会在跑单元测试的时候真实的启一个web服务,然后开始调用controller的rest api,待单元测试跑完之后再将web服务停掉;

contextconfiguration: 指定bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

4.安装测试环境

spring mvc测试框架提供了两种方式,独立安装和集成web环境测试(此种方式并不会集成真正的web环境,而是通过相应的mock api进行模拟测试,无须启动服务器)。

独立安装测试方式

mockmvcbuilders.standalonesetup(object… controllers):通过参数指定一组控制器,这样就不需要从上下文获取了;

主要是两个步骤:

(1)首先自己创建相应的控制器,注入相应的依赖

(2)通过mockmvcbuilders.standalonesetup模拟一个mvc测试环境,通过build得到一个mockmvc

代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50
package com.xfs.test;

import org.junit.assert;

import org.junit.before;

import org.junit.test;

import org.springframework.test.web.servlet.mockmvc;

import org.springframework.test.web.servlet.mvcresult;

import org.springframework.test.web.servlet.request.mockmvcrequestbuilders;

import org.springframework.test.web.servlet.result.mockmvcresulthandlers;

import org.springframework.test.web.servlet.result.mockmvcresultmatchers;

import org.springframework.test.web.servlet.setup.mockmvcbuilders;

import com.alibaba.fastjson.json;

import com.alibaba.fastjson.jsonobject;

import com.xfs.web.controller.apicontroller;

/**

* 独立安装测试方式 springmvc mock测试

*

* @author admin

*

* 2017年11月23日 上午10:39:49

*/

public class testapione {

private mockmvc mockmvc;

@before

public void setup() {

apicontroller apicontroller = new apicontroller();

mockmvc = mockmvcbuilders.standalonesetup(apicontroller).build();

}

@test

public void testgetsequence() {

try {

mvcresult mvcresult = mockmvc.perform(mockmvcrequestbuilders.post("/api/getsequence"))

.andexpect(mockmvcresultmatchers.status().is(200))

.anddo(mockmvcresulthandlers.print())

.andreturn();

int status = mvcresult.getresponse().getstatus();

system.out.println("请求状态码:" + status);

string result = mvcresult.getresponse().getcontentasstring();

system.out.println("接口返回结果:" + result);

jsonobject resultobj = json.parseobject(result);

// 判断接口返回json中success字段是否为true

assert.asserttrue(resultobj.getbooleanvalue("success"));

} catch (exception e) {

e.printstacktrace();

}

}

}

请求结果如下:

详解Spring MVC如何测试Controller(使用springmvc mock测试)

详解Spring MVC如何测试Controller(使用springmvc mock测试)

详解Spring MVC如何测试Controller(使用springmvc mock测试)

集成web环境方式

mockmvcbuilders.webappcontextsetup(webapplicationcontext context):指定webapplicationcontext,将会从该上下文获取相应的控制器并得到相应的mockmvc;

主要是三个步骤:

(1)@webappconfiguration:测试环境使用,用来表示测试环境使用的applicationcontext将是webapplicationcontext类型的;value指定web应用的根

(2)通过@autowired webapplicationcontext wac:注入web环境的applicationcontext容器

(3)然后通过mockmvcbuilders.webappcontextsetup(wac).build()创建一个mockmvc进行测试

代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64
package com.xfs.test;

import org.junit.assert;

import org.junit.before;

import org.junit.test;

import org.junit.runner.runwith;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.mock.web.mockhttpsession;

import org.springframework.test.context.contextconfiguration;

import org.springframework.test.context.junit4.abstractjunit4springcontexttests;

import org.springframework.test.context.web.webappconfiguration;

import org.springframework.test.web.servlet.mockmvc;

import org.springframework.test.web.servlet.mvcresult;

import org.springframework.test.web.servlet.request.mockmvcrequestbuilders;

import org.springframework.test.web.servlet.result.mockmvcresulthandlers;

import org.springframework.test.web.servlet.result.mockmvcresultmatchers;

import org.springframework.test.web.servlet.setup.mockmvcbuilders;

import org.springframework.web.context.webapplicationcontext;

import com.alibaba.fastjson.json;

import com.alibaba.fastjson.jsonobject;

/**

* 集成web环境方式 springmvc mock测试

*

* @author admin

*

* 2017年11月23日 上午11:12:43

*/

@runwith(junit4classrunner.class)

@webappconfiguration

@contextconfiguration(locations = { "classpath*:spring/*.xml" })

public class testapitwo extends abstractjunit4springcontexttests {

@autowired

public webapplicationcontext wac;

public mockmvc mockmvc;

public mockhttpsession session;

@before

public void before() throws exception {

mockmvc = mockmvcbuilders.webappcontextsetup(wac).build();

}

@test

public void testgetsequence() {

try {

mvcresult mvcresult = mockmvc.perform(mockmvcrequestbuilders.post("/api/getsequence"))

.andexpect(mockmvcresultmatchers.status().is(200))

.anddo(mockmvcresulthandlers.print())

.andreturn();

int status = mvcresult.getresponse().getstatus();

system.out.println("请求状态码:" + status);

string result = mvcresult.getresponse().getcontentasstring();

system.out.println("接口返回结果:" + result);

jsonobject resultobj = json.parseobject(result);

// 判断接口返回json中success字段是否为true

assert.asserttrue(resultobj.getbooleanvalue("success"));

} catch (exception e) {

e.printstacktrace();

}

}

}

运行结果和上面独立测试时候一样。

总结:

整个过程:

1、mockmvc.perform执行一个请求;

2、mockmvcrequestbuilders.get("/user/1")构造一个请求

3、resultactions.andexpect添加执行完成后的断言

4、resultactions.anddo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用mockmvcresulthandlers.print()输出整个响应结果信息。

5、resultactions.andreturn表示执行完成后返回相应的结果。

整个测试过程非常有规律:

1、准备测试环境

2、通过mockmvc执行请求

3、添加验证断言

4、添加结果处理器

5、得到mvcresult进行自定义断言/进行下一步的异步请求

6、卸载测试环境

参考: spring-mvc-test-framework

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.linuxidc.com/Linux/2017-12/149851.htm

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 详解Spring MVC如何测试Controller(使用springmvc mock测试) https://www.kuaiidc.com/113419.html

相关文章

发表评论
暂无评论