Spring Boot 单元测试简明代码

一、先上代码

package com.taro.testdemo;

import com.taro.testdemo.demos.service.UserService;
import com.taro.testdemo.demos.web.UserController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@SpringBootTest
class TestDemoApplicationTests {

    /**
     * 1. 测试 UserService
     */
    @Autowired
    private UserService userService;

    @Test
    void userServiceTest() {
        String message = userService.hello("admin");
        System.out.println(message);
    }


    /**
     * 2. 测试单个 Controller: userController
     */
    private MockMvc mockMvc;

    //    @BeforeEach
    public void userControllerBefore() {
        mockMvc = MockMvcBuilders.standaloneSetup(UserController.class).build();
    }

    @Test
    void userControllerTest() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .get("/user/hello").param("name", "admin");
        mockMvc.perform(requestBuilder)
                .andDo(MockMvcResultHandlers.print());
    }


    /**
     * 3. 测试一次性注入多个 Controller
     */
    @Autowired
    private WebApplicationContext context;

    @BeforeEach
    public void allControllerBefore() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    void allControllerTest() throws Exception {
        // 测试 UserController
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .get("/user/hello").param("name", "user");
        mockMvc.perform(requestBuilder)
                .andDo(MockMvcResultHandlers.print());

        System.out.println("=====================================================================");

        // 测试 BasicController
        MockHttpServletRequestBuilder requestBuilder2 = MockMvcRequestBuilders
                .get("/basic/hello").param("name", "basic");
        mockMvc.perform(requestBuilder2)
                .andDo(MockMvcResultHandlers.print());
    }


}

注意:为了单元测试的干净,第二块代码的 @BeforeEach 和第三块代码的 @BeforeEach 最好不要同时存在

二、代码讲解

0. 测试类结构讲解

  1. @SpringBootTest

其作用是启动并加载 Spring 容器上下文

点进这个注解会发现其上还有 @BootstrapWith(SpringBootTestContextBootstrapper.class),这个注解直译就是和 SpringBootTestContextBootstrapper.class 一起启动,而我们一直查看这个类的祖宗类发现在 AbstractTestContextBootstrapper 类下有个 BootstrapContext 对象,而这个对象就是 Spring 容器上下文

  1. org.junit.jupiter.api.Testorg.junit.Test

区别就是所属版本不同org.junit.jupiter.api.TestJunit5 版本的,而 org.junit.TestJunit4 版本的

探究它俩就要用到 @RunWith(SpringRunner.class) 这行代码了,它是用来自定义测试运行器的,而且 RunWithSpringRunner 都是 Junit4 的注解,其中 SpringRunner 类的父类是 SpringJUnit4ClassRunner ,明显可以看出它就是 Junit4 的测试运行器

自 2.2.x 版本开始,spring-boot-stater-test 依赖就内置 Junit5 为默认的测试运行器

综上,当单元测试类只有 @SpringBootTest 一个注解时,默认使用的是 Junit5 的测试运行器,所以 Test 类要导入 org.junit.jupiter.api 包下的,如果老项目只升级了依赖,要么修改所有的 Test 类包路径(不建议),要么给所有测试类加上 @RunWith(SpringRunner.class) 代码(建议)

1. 测试 UserService

这个没啥好讲的,需要注意的是,通过 Autowire 注解注入的实际对象是 UserServiceImpl 对象

2. 测试单个 Controller: userController

  1. MockMvc :用来模拟HTTP请求和 Controller 控制器类的
  2. MockMvcBuilders.standaloneSetup() 方法:注入单个控制器类用以模拟

3. 测试一次性注入多个 Controller

WebApplicationContext 对象就是 Spring Web 的容器上下文,配合 MockMvcBuilders.webAppContextSetup() 方法就能模拟当前整个项目的所有控制器

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot提供了许多方便的工具来编写和运行单元测试。您可以使用JUnit或者Spring Boot自带的测试框架来编写单元测试。 首先,您需要在项目的pom.xml文件中添加测试相关的依赖。通常情况下,Spring Boot已经默认为您添加了JUnitSpring Boot Test依赖,您只需要确保它们存在即可。 接下来,您可以创建一个测试类,并在类上添加`@RunWith(SpringRunner.class)`注解。这将告诉JUnit使用Spring Runner运行测试。您还可以使用`@SpringBootTest`注解来指定要加载的Spring Boot应用程序的配置。 然后,您可以在测试方法上使用`@Test`注解来标记要运行的测试方法。在测试方法中,您可以使用各种断言方法来验证预期的结果。 例如,假设您有一个名为`UserService`的服务类,其中包含一个名为`getUserById`的方法,用于根据用户ID获取用户信息。您可以编写以下单元测试: ```java @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { @Autowired private UserService userService; @Test public void testGetUserById() { User user = userService.getUserById(1L); assertNotNull(user); assertEquals("John Doe", user.getName()); assertEquals("john@example.com", user.getEmail()); } } ``` 在这个例子中,我们使用了`@Autowired`注解将`UserService`注入到测试类中。然后,我们编写了一个名为`testGetUserById`的测试方法,使用断言方法来验证`getUserById`方法的返回结果是否符合预期。 运行测试时,Spring Boot会自动启动整个应用程序上下文,并注入所需的依赖项。您可以使用各种断言方法来验证预期的结果。 这只是Spring Boot单元测试的一个简单示例,您可以根据实际需求编写更复杂的测试。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值