概述
在日常的开发中,我们一般会定义一个 service 层,用于实现业务逻辑,并且针对 service 层会有与之对应的齐全的覆盖率高的单元测试。而对于 controller 层,一般不怎么做单元测试,因为主要的核心业务逻辑都在 service 层里, controller 层只是做转发,调用 service 层接口而已。但是还是建议使用单元测试简单的将 controller 的方法跑一下,看看转发和数据转换的代码是否能正常工作。
在 spring boot 里对 controller 层进行单元测试非常简单,只需要几个注解和一点点辅助代码即可搞定。
依赖的包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<dependency> <groupid>org.junit.jupiter</groupid> <artifactid>junit-jupiter-api</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>org.junit.jupiter</groupid> <artifactid>junit-jupiter-engine</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> </dependency> |
使用的spring boot 版本
2.0.4.release
代码
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 |
@extendwith (springextension. class ) @springboottest (webenvironment =springboottest.webenvironment.mock,classes = testapplication. class ) @autoconfiguremockmvc public class usercontrollertest { @autowired private mockmvc mockmvc; @mockbean private userservice userservice; @test @displayname ( "测试controller方法" ) void test() throws exception { user param = new user(); param.setuserid( 1111 ); list<address> addresslist = new arraylist<>(); address address = new address(); address.setname( "我的地址" ); addresslist.add(address); param.setaddresslist(addresslist); mvcresult mvcresult = mockmvc.perform( post( "/xxx/test" ) .contenttype(mediatype.application_json) .content(json.tojsonstring(param))) .andreturn();
system.out.println(mvcresult.getresponse().getcontentasstring()); } } |
1 2 3 |
@requestmapping (value = "/xxx" , method = requestmethod.post) public object test( @requestbody (required = false )user user) throws exception { } |
如果你只是想简单的跑一下 controller 层,不想真正的去执行 service 方法的话,需要使用 @mockbean 将对应的 service 类 mock 掉。
1 2 |
@mockbean private userservice userservice; |
使用 spring boot test 的时候,它需要一个 applicationcontext ,我们可以在 @springboottest 注解中使用 classes 属性来指定。
1 |
@springboottest (webenvironment =springboottest.webenvironment.mock,classes = testapplication. class ) |
testapplication 的代码很简单。
1 2 3 4 5 6 7 8 9 10 |
@springbootapplication public class testapplication { public static void main(string[] args){ springapplicationbuilder builder = new springapplicationbuilder(); builder.environment( new standardenvironment()); builder.sources(testapplication. class ); builder.main(testapplication. class ); builder.run(args); } } |
接下来我们只需要使用 mockmvc 发送 post 请求即可。如果 controller 层的 post 方法是带 @requestbody 注解的,可以先将入参对象转换成 json 字符串。这里使用的是 fastjson 。
1 |
json.tojsonstring(param) |
经过测试,如上代码能正常工作。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/linsongbin1/article/details/83574619
查看更多关于SpringBoot Controller Post接口单元测试示例的详细内容...