面试题答案
一键面试- Mock和Stub技术说明
- Mock:Mock是创建一个模拟对象,用来代替真实的外部服务对象。它可以对外部服务的行为进行编程式控制,比如定义特定输入时的返回值等。Mock通常用于验证被测试函数是否正确调用了外部服务以及调用的参数是否正确。
- Stub:Stub也是模拟外部服务的一种方式,但侧重于为被测试函数提供固定的响应,而不关心函数对外部服务的调用情况。Stub主要目的是让被测试函数能够在隔离环境下正常运行,避免依赖外部服务的实际调用。
- Mockito框架在Kotlin中实现Mock和Stub的代码示例
- 首先添加Mockito依赖到
build.gradle.kts
文件中:
- 首先添加Mockito依赖到
testImplementation("org.mockito.kotlin:mockito - kotlin:4.1.0")
- 假设我们有一个
UserService
接口和一个依赖它的UserController
类:
interface UserService {
fun getUserById(id: Int): String
}
class UserController(private val userService: UserService) {
fun getUserNameById(id: Int): String {
return userService.getUserById(id)
}
}
- 使用Mockito进行Mock和Stub的单元测试:
import org.junit.jupiter.api.Test
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import kotlin.test.assertEquals
class UserControllerTest {
@Test
fun testGetUserNameById() {
// 创建UserService的Mock对象
val mockUserService: UserService = mock()
// 使用Stub为Mock对象定义行为
whenever(mockUserService.getUserById(1)).thenReturn("Mocked User")
val userController = UserController(mockUserService)
val result = userController.getUserNameById(1)
assertEquals("Mocked User", result)
}
}
在上述代码中,我们通过mock()
方法创建了UserService
的Mock对象,然后使用whenever
对getUserById
方法进行Stub,定义输入为1
时返回"Mocked User"
。最后在测试UserController
的getUserNameById
方法时,验证返回结果是否符合预期。