SpringBoot 单元测试入门实践

前言

软件测试的重要性毋庸置疑。大部分公司主业务的支撑软件,在开发时都会要求编写测试。在日常开发中,也有不少要求我们写测试的场景,例如你将要开源扩展包,拥有完整测试永远是加分项 💯。

项目环境

  • JDK 14
  • Gradle 6.3
  • macOS 10.15
  • SpringBoot 2.3.4

JUnit 介绍

大部分新手在测试程序的时候,喜欢用 System.out.println() 方法,直接把结果打印出来,看看结果是否符合预期。这种方法在测试代码量很小、逻辑简单的程序时很方便。在实际生产项目中,我们可以尝试一下 JUnit 工具。

JUnit 是 Java 语言的测试框架。它可以根据测试数据来验证程序正确性,并且测试代码与工程代码分离。只要在方法上加上 @Test 注解,JUint 就能识别到这个方法。

引入依赖

这里我们使用的构建工具是 gradle,所以打开 build.gradle 文件引入依赖。该依赖包含了 JUnit 等,所以无需再单独引入 JUnit。

implementation 'org.springframework.boot:spring-boot-starter-test:2.3.4.RELEASE'

测试 Service 层

编写一份 DemoService 接口,该接口只有一个 sayHelloTo 方法来用于我们简单的单元测试。

public interface DemoService {
    /**
     * Hello World!
     * @param name 名称
     * @return String
     */
    String sayHelloTo(String name);
}

创建 DemoServiceImpl 类,实现 DemoService 接口。这里可使用 ⌥ + ⏎ 快速创建接口实现类。

@Service
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHelloTo(String name) {
        return "say hello to " + name;
    }
}

SpringBoot 的单元测试写在 src/tests 目录下,如果你使用的是 IDEA IDE,可按下 ⇧ + ⌘ + T 来快速创建测试文件。

@SpringBootTest
class DemoServiceTest {
    @Autowired
    private DemoService demoService;
    @Test
    void sayHelloTo() {
        String result = demoService.sayHelloTo("developer");
        Assertions.assertEquals("say hello to developer", result);
    }
}

上面就是最简单的单元测试写法,注入 @SpringBootTest 注解即可。想要执行的时候,鼠标放在对应的方法,右键选择 run。

测试 Controller 层

编写一份 DemoController,创建一个 sayHelloTo 方法,并且注入 DemoService 接口。

@RestController
public class DemoController {
    @Autowired
    private DemoService demoService;

    @GetMapping("demo")
    public String sayHelloTo(String name) {
        return demoService.sayHelloTo(name);
    }
}

沿用 ⇧ + ⌘ + T 快捷键创建控制器测试类,这里用到了 MockMvc,MockMvc 是由 spring-test 包提供,实现了对 HTTP 请求的模拟,能够直接使用网络的形式,转换到 Controller 的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。

@AutoConfigureMockMvc
@SpringBootTest
class DemoControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void sayHelloTo() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/demo?name=developer"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("say hello to developer"))
                .andDo(MockMvcResultHandlers.print());
    }
}

这里简单的使用 MockMvc 测试 API 接口返回的 HTTP STATUS CODE 以及返回的内容,并将整个响应结果输出出来。

总结

这里非常简单的过了一遍 SpringBoot 单元测试流程,也只是作为一个入门实践记录在这儿。对 JUnit 和 MockMvc 有了一个最基础的认识,有兴趣的伙伴可以自己查询一些资料进行深入学习。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Hello。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!