本文主要分析Mockito在Spring Boot测试中的应用;
关于Spring Boot基本测试场景及说明可以参考此文。
本文基于Spring Boot+Kotlin实现相关示例,工程源代码: https://github.net/icarusliu/learn
所有关于本文描述的测试入口均在类:TestLearninterceptorApplication中。
0 概述
Mockito用于测试时进行打桩处理;通过它可以指定某个类的某个方法在什么情况下返回什么样的值。
一般在单元测试时,只需要关注当前正在测试的类;但这个测试类可能会使用到多个其它类,如本文示例中TestController2类使用了TestService;TestService的类的测试应该在其本身的单元测试类中进行,而在测试TestController2时,应当尽量避免TestService带来各种影响,否则随着引用类的增加,测试场景会越来越复杂。这个时候就可以假设TestService在某些场景下会返回某些值,从而来降低引用类所带来的测试复杂度增加的影响。Mockito就用于这种场景。
Mockito常用测试场景描述如下:
- 指定打桩对象的返回值
- 判断某个打桩对象的某个方法被调用及调用的次数
- 指定打桩对象抛出某个特定异常
Mockito的使用,一般有以下几种组合:
- do/when:包括doThrow(…).when(…)/doReturn(…).when(…)/doAnswer(…).when(…)
- given/will:包括given(…).willReturn(…)/given(…).willAnswer(…)
- when/then: 包括when(…).thenReturn(…)/when(…).thenAnswer(…)
关于各个用法详见后续描述。
本文示例中测试的对象包括TestController2/TestService; 具体实现见GITHUB工程; 其中TestController2的testService方法中,包含对TestService对象的test方法调用:
@RequestMapping("/service")
@Throws(Exception::class)
fun testService(): String {
return testService.test("test")
}
TestService的test方法实现如下:
@Throws