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

3.1 KiB
Raw Blame History

Spirng Test

Unit Test

Introduce

在运行单元测试时,无需实际启动容器,可以通过mock objects的方式来独立的对代码进行测试。故而,单元测试通常运行的十分快。

Mock Objects

spring包含如下专门用于mock的包

  • Environment
  • JNDI
  • Servlet API
  • Spring Web Reactive

Environment

org.springframework.mock.env包中包含EnvironmentPropertySource抽象类的实现。在编写针对依赖环境变量代码的测试时,MockEnvironmentMockPropertySource将会非常有用。

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支持一致导入ApplicationContextWebApplicationContext并针对这些context做缓存。

支持对于已导入上下文的缓存是很重要的因为spring实例化对象时花费的时间会很长。故而如果针对每个测试的每个test fixture之前都会加载对象的开销。

默认情况下,一旦ApplicationContext导入那么每个test都会复用导入的上下文。故而每个test suite都只会有一次导入开销并且后续测试的执行要快得多。其中test suite代表运行在相同jvm中的所有测试

Test Fixtures依赖注入

当TestContext framework导入应用上下文时其可以针对test class使用依赖注入。并且可以跨测试场景重复使用应用程序上下文避免在独立的测试用例之间重复执行fixture设置。