SpringBoot学习笔记:单元测试

227 阅读3分钟

本文内容来自Spring Boot相关书籍学习总结

Spring Boot集成单元测试

单元测试主要用于测试单个代码组件,以确保代码按预期方式工作。Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。

1、导入pom依赖spring-boot-starter-test

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

该依赖包提供了大量应用测试需要的工具和注解。

常用单元测试注解:

  • @RunWith(SpringRunner.class):结合Junit的测试运行器,声明测试运行在Spring环境,作用类上
  • @SpringBootTest:配置SpringBoot测试功能,作用类
  • @Test:测试方法,作用方法
  • @Ignore:忽略测试方法,作用方法
  • @BeforeClass:针对所有测试,只执行一次,且必须为static void
  • @Before:初始化方法,执行当前测试类的每个测试方法前执行
  • @After:释放资源,执行当前测试类的每个测试方法后执行
  • @AfterClass:针对所有测试,只执行一次,且必须为static void

2、Service层单元测试

一般使用Spring Boot进行单元测试主要是针对Service和API(Controller)进行。

使用IDEA可以一键自动创建单元测试类。首先,选择需要测试的Service类或方法,然后在对应的Service类中右击,选择Go To→Test→Create New Test,打开如图所示界面

image.png

勾选待测试方法,单击OK按钮生成测试类。

在测试方法中实现对应的测试代码。

@SpringBootTest
class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    void findUser() {
        Assert.notNull(userService.findUser(5L),"用户不存在");
    }
}

2、Controller层单元测试

使用mockmvc,它是基于RESTful风格的SpringMVC单元测试,可以测试完整的SpringMVC流程。

1、MockMvc

  • 服务器端SpringMVC测试的主入口点。
  • 通过MockMVCBuilders建造者的静态方法创建MockMVCBuilder,MockMvc由MockMVCBuilder构造。
  • 核心方法:perform(RequestBuilder rb),执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions。

2、MockMVCBuilder

  • MockMVCBuilder是使用构造者模式来构造MockMvc的构造器。
  • 主要有两个实现:StandaloneMockMvcBuilderDefaultMockMvcBuilder
  • 可以直接使用静态工厂MockMvcBuilders创建即可。

3、MockMvcBuilders

  • 负责创建MockMVCBuilder对象。

  • 有两种创建方式

    • standaloneSetup(Object... controllers): 通过参数指定一组控制器,这样就不需要从上下文获取了。
    • webAppContextSetup(WebApplicationContext wac):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc。

4、MockMvcRequestBuilders

  • 用来构建Request请求的。
  • 其主要有两个子类MockHttpServletRequestBuilderMockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。

5、ResultActions

  • andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。

  • andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台。

  • andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理。

  • MockMvcResultMatchers

    • 用来匹配执行完请求后的**结果验证。
    • 结果匹配失败将抛出相应的异常。
    • 包含了很多验证API方法。
  • MockMvcResultHandlers

    • 结果处理器,表示要对结果做点什么事情。
    • 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息

6、MvcResult

单元测试执行结果,可以针对执行结果进行自定义验证逻辑

通用模板:

@SpringBootTest
@RunWith(SpringRunner.class)
public class MockMVCTest {

    private MockMvc mockMvc;

    @Autowired
    private UserController userController;

    @Before
    public void setUp(){
        mockMvc = MockMvcBuilders.standaloneSetup(userController).build();//初始化mockmvc
    }

    @Test
    public void testView() throws Exception{
        String requestBody = "{\"id\":\"1\"}";

        MvcResult result = mockMvc.perform(MockMvcRequestBuilders
            .post("/user/1")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .content(requestBody))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();
    }

}

对于返回的结果,可以使用断言进行判断。