编写不易,转载请注明( hhttp://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. **...