一、常用注解
依赖:
SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(1)@RunWith 指定运行环境,例:
@RunWith(SpringRunner.class) Junit运行Spring的测试环境
**@RunWith(MockitoJUnitRunner.class) **Junit运行Mockito的运行环境,不会加载springboot上下文
@SpringBootTest 加载springboot上下文配置
(注意: @RunWith(MockitoJUnitRunner.class) 不能和 @RunWith(SpringRunner.class) 同时使用,而一般都需要 @RunWith(SpringRunner.class) 提供spring容器环境,所以很少用这个注解)
(2)@Mock 用于模拟一个服务,例如:
测试的时候需用调用B服务,但是B服务没写 好,这是可以先Mock一个B服务
(3)@InjectMocks 标注服务的实现类
创建一个实例,其余用@Mock注解创建的mock将被注入到用该实例中
(4)@Before 每个测试方法执行前,执行一次
(5)@After 每个测试方法执行完,执行一次
(6)@Test 标注测试方法
(7)@MockBean : mock对应引入的bean
二、注入其它mock对象
如果一个mock对象中需要注入其它mock对象,比如要mock UserService,UserService 依赖于另一个mock对象orderService,这时就不能直接对 UserSiervice 使用 @Mock 直接的注解,需要:
- 测试类上加
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
- 标注 @InjectMocks + @Autowired之类的注入注解
@SpringBootTest
@RunWith(SpringRunner.class)
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class) //step1
public class RuleRpcServiceTest extends KdAbstractJUnit4SpringContextTests {
@Mock
private OrderService orderService;
//step2
@InjectMocks
@Resource
private UserServiceImpl userService;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
}
三、when…then和do…when用法
when…then:
Long userId = 10L;
//thenReturn 返回指定数据
when(userService.findById(userId)).thenReturn(new User(userId, null));
//触发上面mock定义的thenReturn
User user1 = userService.findById(userId);
System.out.println(user1);
//thenCallRealMethod 调用mock类原本的方法
when(userService.findById(userId)).thenCallRealMethod();
do…when:
doReturn(new User(userId, null)).when(userService).findById(userId);
doCallRealMethod().when(userService).findById(userId);
doThrow(new RuntimeException("xxx不合法")).when(userService).findById(userId);
四、controller单元测试
(1)、MockMvcRequestBuilders
构建各类HTTP Request请求的工厂方法
- get(urltemplate, vars)
- post(urltemplate, vars)
- delete(urltemplate, vars)
- put(urltemplate, vars)
(2)MockHttpServletRequestBuilder
构建Request的缺省builder
- cookie(Cookie… cookie): 设置信息
- content(String str): 请求内容
- contentType(): 设置contentType类型
- param(String name, String … value): 设置参数
- session()
- requestAttr()
- flashAttr()
- locale()
- accept(): 接手内容类型MediaType
(3)ResultMatcher
功能描述: 用来执行
- match(MvcResult result): void 针对执行结果进行断言判断
- matchAll(ResultMatcher… matchers) : ResultMatcher 执行断言,批量执行
(4)ResultHandler
结果信息Handler
- void handle(MvcResult result) : 处理结果信息
(5)ResultActions
- andExpect(ResultMatcher var1) : ResultActions 对返回的Result结果进行断言, 返回为ResultActions,运行流式风格调用
- andDo(ResultHandler handler): ResultActions 添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。返回对象为ResultActions
- andReturn() : MvcResult 表示执行完成后返回相应的结果,其结果为MvcResult
(6)MvcResult
访问Http请求的结果信息
- getRequest()
- getResponse()
- getHandler()
- getModelAndView()
…
(7)MockMvcResultMatchers
提取请求结果信息的各类断言
- status(): StatusResultMatchers 得到响应状态验证器
- content(): 内容
- header(): 头信息,比如验证处理器类型/方法名
- model(): 模型信息
- flash(): Flash attribute
- forwardedUrl(): 验证处理完请求后转发的url(绝对匹配)
- redirectedUrl()
- cookie()
- jsonPath(String expression, Matcher matcher) 得到Json表达式验证器
- jsonPath(String expression, Object… args)
- xpath(String expression, Object… args)
- xpath(String expression, Matcher matcher)
其中Matcher类为org.hamcrest包中的类。
(8)StatusResultMatchers
检查结果中的各类信息
- isBadRequest(): 不合法的请求
- isOk(): 200
参考:springBoot项目使用Mock单元测试Controller层 - 知乎
接口demo:
@GetMapping("/xx/listXxx/{param}")
public ResultSet<List<XXXXVO>> listXxx(@PathVariable("param") String param){
//查询逻辑
List<XXXXVO> xxList = new ArrayList<>();
return ResultSet.success(xxList);
}
单元测试:
@Test
public void testListXxx() throws Exception {
//请求的url地址
String url = "/xx/listXxx/{param}";
//构造Request,param=123456
mvc.perform(MockMvcRequestBuilders.get(url, "123456")
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().json("{'code':'200'}"))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
版权归原作者 Hey 锡瑞 所有, 如有侵权,请联系我们删除。