编写不易,转载请注明( 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"); } ); } }
相关推荐
接下来,文档给出了不同测试类的参考示例,例如TestNGDemo、MockitoDemo、Controller单元测试类、Service服务单元测试类以及Dubbo服务单元测试类。通过查看这些示例代码,开发者可以了解如何在实际项目中编写各种...
在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...
在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的正确性和可靠性。Spring Boot提供了方便的工具和库,使得编写和执行单元测试变得简单高效。本章节我们将深入探讨Spring Boot中的...
Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展的...总之,通过正确使用JUnit、Mockito、Spring Test以及MockMVC,我们可以编写出全面、有效的Spring MVC单元测试,确保代码质量并降低潜在的bug。
在实际开发中,我们应该编写单元测试和集成测试来确保Controller的正确性。JUnit和Mockito等工具可以帮助我们进行测试。 总的来说,"类似Spring Controller注解Demo"是一个关于如何在Spring MVC中使用Controller...
在本文中,我们将深入探讨如何使用Spring框架进行单元测试,特别是在一个基于Java配置的Web项目中。我们将重点关注如何集成H2内存数据库以简化测试过程,以及如何针对Controller层和服务层进行有效的测试。 首先,...
在Spring Boot中,单元测试是确保代码质量和可维护性的重要组成部分。通过单元测试,开发者能够独立验证代码的各个部分,确保它们按照预期工作,并在修改代码后快速发现潜在问题。Spring Boot为此提供了一系列便利...
在单元测试中,Spring的Mockito库可以用来模拟协作对象,以便隔离被测试的代码。 3. **单元测试**:单元测试是软件开发过程中的重要环节,它验证单个代码单元(如方法或类)的功能是否符合预期。JUnit是Java中最...
在Java和Spring Boot环境中,我们可以使用JUnit框架来进行单元测试,同时结合Mockito等工具来模拟对象行为,以便专注于测试目标方法。 对于多模块的Spring Boot项目,每个模块可能包含不同的组件,如Service层、...
总结来说,Spring Boot多模块项目中Service层的单元测试是一个系统的过程,涉及到测试环境搭建、测试类编写、模拟对象的使用以及断言和覆盖率的检查。通过有效的单元测试,我们可以保证Service层的业务逻辑正确,...
此外,Spring的Mockito集成允许我们创建mock对象,模拟协作对象的行为,避免了因依赖过多而导致的复杂测试场景。`@MockBean`可以在测试上下文中替换真实bean,而`@SpyBean`则可以在原有bean基础上创建一个spy,部分...
本文将详细介绍如何在Spring Boot项目中实现基于Service和Controller层的单元测试。 #### 二、Spring Boot中的单元测试框架 在Spring Boot中进行单元测试通常依赖于一系列的测试框架和工具,包括但不限于JUnit、...
对于Spring和JPA的应用,我们可以使用JUnit和Mockito进行单元测试。JUnit是Java的单元测试框架,Mockito则用于模拟协作对象,使得测试更加隔离。Spring Boot提供了一个测试框架,允许我们轻松地创建和配置测试环境,...
我们还可以使用JUnit进行单元测试,测试单个类或方法的功能,以及Mockito等库来模拟协作对象,确保测试的隔离性。对于集成测试,Spring Boot的TestRestTemplate或WebTestClient可以用来发送HTTP请求并验证响应。 总...
JUnit作为Java领域最流行的单元测试框架,与Spring MVC和Spring Boot的集成使得开发者能够更高效地进行测试驱动开发(TDD)或行为驱动开发(BDD)。下面将详细介绍这个主题中的相关知识点。 1. JUnit JUnit是一个...
在这个项目"spring-unit-tests"中,我们将探讨如何在Spring Boot应用中结合Mockito进行单元测试,特别是针对控制器和服务层。 首先,让我们了解Spring Boot。它是一个基于Spring框架的轻量级脚手架,旨在简化新...
综上所述,"spring-boot-test"示例程序涵盖了Spring Boot中测试的核心概念,包括Rest Controller的集成测试、单元测试的策略以及测试工具的使用,这些都是保证软件质量和可维护性的重要组成部分。通过学习和实践这些...
对于测试部分,可以学习如何使用Mockito进行单元测试,以及如何利用Spring Boot Test的特性进行集成测试,比如模拟HTTP请求和数据库操作。 总的来说,SpringTest项目为我们提供了一个学习和实践Spring框架的起点,...
对于SSM整合项目,我们可以使用JUnit作为测试框架,Mockito进行模拟对象测试,PowerMock进行静态方法和私有方法的测试。测试主要包括对Service层和Mapper层的测试,确保业务逻辑和数据库操作的正确性。 6. **...