测试好处多多。但在 spring boot 里写测试,别说得到好处,就连把测试框架搭对都不是个简单的事。
毋庸置疑, 相对于 Golang, python 的网络测试框架, java 里 spring 里的测试框架真是复杂的可以. 约定优于配置, 这约定漫天飞舞藏在文档的各个角落. 版本还不统一.
一般我们写后端逻辑分 3 层, Controller -> Service -> Repository,简单来说,
对于单元测试
,我们只针对某一个功能点写测试
而对于集成测试
,我们会集成多个功能。
spring boot 为这两种测试,都提供了具体的约定方法。
spring boot 启动慢,我们测试时应该尽可能的只启动我们需要的类。 怎么做到呢?
spring boot 分层测试
我们看上面 spring 简化的请求图。 如果是单元测试。我们应该只对 3 测(依赖 4),只对 4 测(依赖 5)。 而集成测试,我们应该是可以测 1 到 5. 当然,这个界定根据你的需求来。
在测试前,我们先把 pom 的包统一下.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
完整源码地址: https://github.com/zk4/spring_test_demo
测试场景
我们要将测试场景列个矩阵
不加载 spring 框架 的单元测试
这是最灵活也是最快的一种方案
拿 Controller 举例
Controller 其实就是一个类. 理论上 new 出来测就行了
但问题是: Controller 里会被 Spring 注入一堆东西.
简单的解决方法是:
不要在成员上加 @Autowired, 而是在构造时自动注入. 这也是 Spring 官方的推荐做法.