单元测试是开发人员编写的一小段代码,用于检验被测代码的一个有明确功能的小模块是否正确
- 通常是用来判断某个类和函数的行为
- 白盒测试
- 开发人员是最大的收益者
作者: 刘欣–码农翻身
在编写单元测试的时候Spring 通常不需要介入,Spring 鼓励松耦合 、接口驱动的设计,这些都能让你很轻松的编写单元测试。
Sping 的SpringRuner可以在基于JUnit的应用程序测试里加载Spring 应用程序的上下文。Spring Boot
除了拥有Spring的集成测试支持,还开启了自动配置和Web服务器,还提供不少实用的测试辅助工具。Spring Framework
的核心工作是将所有组件编制在一起,构成一个应用程序。整个过程就是读取配置说明(可以是XML,基于Java的配置,基于Groovy的配置或其他类型嗯配置),
在应用程序上下文里初始化Bean,将Bean 注入到依赖它们的其他Bean中。
本次介绍简单的单元测试!!!
在搭建Spring Boot成功后 ,会自带一个测试类,
package com.connxun;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Test
public void contextLoads() {
}
}
@RunWith 的 参数是SpringRuner.class, 开启了Spring集成测试支持。
@SpringBootTest注解是SpringBoot自1.4.0版本开始引入的一个用于测试的注解
1. 不依赖web模块的单元测试,示例以两种方式读取项目属性文件的值
项目application.yml配置文件内容如下:
testMsg: 成功
2. 测试Web应用程序
写一个Controller测试类
修改一下程序端口:
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebTest {
/**
* @LocalServerPort 提供了 @Value("${local.server.port}") 的代替
*/
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
private URL base;
@Before
public void setUp() throws Exception {
System.out.println("测试开始====" + System.currentTimeMillis());
String url = String.format("http://localhost:%d/", port);
System.out.println(String.format("port is : [%d]", port));
this.base = new URL(url);
}
@After
public void setEnd() throws Exception {
System.out.println("测试结束====" + System.currentTimeMillis());
}
@Test
public void webTest_1() {
ResponseEntity<String> response = this.restTemplate.getForEntity(
this.base.toString() + "/test", String.class, "");
System.out.println(String.format("response----测试结果为:%s", response.getBody()));
ResponseEntity<String> res = this.restTemplate.getForEntity(
"http://localhost:{port}" + "/test", String.class, port);
System.out.println(String.format("res----测试结果为:%s", res.getBody()));
}
}
控制台日志:
@Before 表明这个方法在测试方法之前执行。
@After 表明这个方法在测试方法之后执行。
classes = Application.class
指明启动类。
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
@LocalServerPort
MOCK —提供一个Mock的Servlet环境,内置的Servlet容器并没有真实的启动,主要搭配使用@AutoConfigureMockMvc
RANDOM_PORT — 提供一个真实的Servlet环境,也就是说会启动内置容器,然后使用的是随机端口
DEFINED_PORT — 这个配置也是提供一个真实的Servlet环境,使用的默认的端口,如果没有配置就是8080
NONE — 这是个神奇的配置,跟Mock一样也不提供真实的Servlet环境。
启动随机端口,本次测试的端口是60506,两者搭配使用。会生成随机端口注入到变量中。
我用了两种绑定端口的方式。
参考:
https://blog.youkuaiyun.com/limenghua9112/article/details/79694849