编写不易,转载请注明( http://shihlei.iteye.com/blog/2383971)!
一 概述:
实现spring rest controller 单元测试,依赖service mock,用于重点测试controller的行为
二 maven 依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>x.test</groupId> <artifactId>test</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>test</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version> <mockito.version>2.8.47</mockito.version> <powermock.version>1.7.0</powermock.version> <assertj.version>3.8.0</assertj.version> <servlet-api.version>3.1.0</servlet-api.version> <spring.version>4.3.4.RELEASE</spring.version> </properties> <dependencies> <!-- test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>${mockito.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>${assertj.version}</version> <scope>test</scope> </dependency> <!--web --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet-api.version}</version> </dependency> <!-- mvc --> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- utils --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
三样例
1)待测试controller 及依赖的service
package x.test.adv.service; import x.test.adv.dao.pojo.User; /** * 用户服务 * <p> * Created by shilei on 2017/7/10. */ public interface UserService { /** * 保存 , 如果保存成功,记录日志 * * @param user user */ void save(User user); } /** * 用户 * <p> * Created by shilei on 2017/7/10. */ public class User { }
package x.test.adv.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import x.test.adv.dao.pojo.User; import x.test.adv.service.UserService; /** * user controller * <p> * Created by shilei on 2017/7/10. */ @RestController @RequestMapping("/user/v1") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/{id}", method = RequestMethod.POST) public String save(@ModelAttribute User user) { try { userService.save(user); return "success"; } catch (Exception e) { return "error : " + e; } } }
2)单测程序
package x.test.adv.controller; import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.mock.web.MockServletContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import x.test.adv.service.UserService; /** * rest test * Created by shilei on 2017/7/10. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MockServletContext.class) @WebAppConfiguration public class UserControllerTest { private MockMvc mockMvc; @Mock private UserService userService; @InjectMocks private UserController userController; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); this.mockMvc = MockMvcBuilders.standaloneSetup(userController).build(); } @Test public void test_UserController_save_return_success() throws Exception { //mock 行为 Mockito.doNothing().when(userService).save(Mockito.any()); //构建请求 RequestBuilder request = MockMvcRequestBuilders.post("/user/v1/1"); //断言结果 mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().string("success")); } @Test public void test_UserController_save_return_start_error() throws Exception { //mock 行为 模拟错误路径查看返回 Mockito.doThrow(new IllegalArgumentException("user error !")).when(userService).save(Mockito.any()); //构建请求 RequestBuilder request = MockMvcRequestBuilders.post("/user/v1/2"); //断言结果 mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()) .andExpect( result -> { Assertions.assertThat(result.getResponse().getContentAsString()).startsWith("error"); } ); } }
相关推荐
本篇文章主要介绍了基于Springboot+Junit+Mockito做单元测试的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito ...
spring集成TestNG与Mockito框架单元测试方法,方便学习者能快速上手如何单测,对自己的代码能够有质量保证。
spring集成TestNG与Mockito框架单元测试方法
虽然测试分为单元测试,集成测试,系统测试等等,但是作为开发,我们可能不需要做这么多的测试(有时甚至不做……)接下来就说说和开发息息相关的单元测试以及集成测试。 单元测试就是模块测试,我的理解一个模块...
内容概要:参考Mockito官方API文档,实践框架每个特性。 适合人群:Mockito入门人员以及想全面熟悉Mockito特性的人员,做到了开箱即用。 能学到什么:“Mockito 4.6.0 + Junit 5”的组合编程。 使用建议:使用前安装...
主要介绍了Java mockito单元测试实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
dagger2 示例使用 Dagger2、Espresso 2.0 和 mockito 的 Android 单元测试示例。
今天小编就为大家分享一篇关于Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
mockito junit 单元测试 mockito junit 单元测试
Mockito+junit5搞定单元测试
包含 Junit + Hamcrest + Mockito 单元测试涉及到的三个jar包,分别是junit.jar、hamcrest-2.2.jar、mockito-core-3.2.4.jar
Packed with real-world examples, the book covers how to make Spring code testable and mock container and external dependencies using Mockito. You then get a walkthrough of the steps that will help ...
编程语言+JAVAspring+测试...它介绍了JAVAspring的测试框架的概念、原理和作用,以及如何使用JAVAspring的测试框架来进行单元测试,包括JUnit、TestNG、Mockito、Spring Test等内容,以及一些配置文件和注解的用法。
NULL 博文链接:https://bert82503.iteye.com/blog/2106577
[JavaWeb]_[初级]_[对Jfinal框架的Controller进行单元测试] 博客文章https://infoworld.blog.csdn.net/article/details/124176492对应的项目, 使用maven管理项目,导入pom.xml.
实用单元测试解决方案Tomek Kaczanowski撰写的“使用JUnit和Mockito进行实践单元测试”一书中的练习解决方案
简单的Mockito 使用Mockito进行单元测试 参考: :
一本关于 spring 和 mockito 的书 Sujoy Acharya-Mockito for Spring-Packt Publishing
这种特定于域的语言使您可以使用类似Json的符号声明复杂的Java对象。 除此之外,它还允许您以一种自然的方式指定当使用给定值调用时,mockito模拟应该返回什么。