Files
rikako-note/spring/spring test/SpringTest.md
2024-05-31 19:11:42 +08:00

66 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spirng Test
## Unit Test
### Introduce
在运行单元测试时,无需实际启动容器,可以通过`mock objects`的方式来独立的对代码进行测试。故而,单元测试通常运行的十分快。
### Mock Objects
spring包含如下专门用于`mock`的包
- Environment
- JNDI
- Servlet API
- Spring Web Reactive
#### Environment
`org.springframework.mock.env`包中包含`Environment``PropertySource`抽象类的实现。在编写针对依赖环境变量代码的测试时,`MockEnvironment``MockPropertySource`将会非常有用。
#### JNDI
`org.springframework.mock.jndi`包中包含`JNDI SPI`的部分实现因而可以建立一个简单的JNDI环境。
#### Servlet API
`org.springframework.mock.web`包中包含一整套`servlet api mock object`这些mock object针对spring web mvc框架使用。
### Unit Test Support Class
spring中包含一系列类来帮助单元测试
- 通用测试组件
- spring mvc测试组件
#### 通用测试组件
`org.springframework.test.util`中包含一系列类用于单元测试和集成测试。
`AopTestUtils`中拥有一系列aop相关的方法。可以通过AopTestUtils中的方法获取隐藏在一层或多层代理下的`target`对象。
`ReflectionTestUtils`中拥有一系列反射相关的方法可以通过ReflectionTestUtils中的方法修改常量值、访问非public的field或method。通常ReflectionTestUtils可用于如下场景
- ORM框架中针对protected或private filed的访问
- spring注解@Autowired@Inject@Resource@PostConstruct)中对于类中非公有成员的访问
`TestSocketUtils`可以查找本地可以连接的TCP端口通常用于集成测试。
#### spring mvc测试组件
`org.springframework.test.web`包包含了`ModelAndViewAssert`.
## 集成测试
集成测试拥有如下特性:
- 通过spring上下文正确注入
- 可以通过JDBC或ORM工具进行数据库访问
集成测试会实际启动spring容器故而速度要比单元测试慢。
### 集成测试主要目标
集成测试主要支持如下目标:
- 在测试之间管理ioc容器缓存
- 在测试时提供依赖注入
- 在集成测试时提供事务管理
- 在编写集成测试时提供spring相关的类
### Context Management and Caching
spring TestContext framework支持一致导入`ApplicationContext``WebApplicationContext`并针对这些context做缓存。
> 支持对于已导入上下文的缓存是很重要的因为spring实例化对象时花费的时间会很长。故而如果针对每个测试的每个test fixture之前都会加载对象的开销。
默认情况下,一旦`ApplicationContext`导入那么每个test都会复用导入的上下文。故而每个test suite都只会有一次导入开销并且后续测试的执行要快得多。其中`test suite`代表运行在相同jvm中的所有测试
### Test Fixtures依赖注入
当TestContext framework导入应用上下文时其可以针对test class使用依赖注入。并且可以跨测试场景重复使用应用程序上下文避免在独立的测试用例之间重复执行fixture设置。