面试题答案
一键面试- 引入依赖:
在
build.gradle.kts
(如果是Kotlin DSL)中添加Mockk依赖:
在testImplementation("io.mockk:mockk:1.13.5")
build.gradle
(如果是Groovy DSL)中:testImplementation 'io.mockk:mockk:1.13.5'
- 示例代码:
假设我们有一个
UserService
接口和一个依赖它的UserManager
类。
以下是使用Mockk进行单元测试的代码:// UserService接口 interface UserService { fun getUserById(id: String): String } // UserManager类,依赖UserService class UserManager(private val userService: UserService) { fun getUserNameById(id: String): String { return userService.getUserById(id) } }
import io.mockk.every import io.mockk.mockk import io.mockk.verify import org.junit.jupiter.api.Test import kotlin.test.assertEquals class UserManagerTest { @Test fun `test getUserNameById with normal return`() { // 创建UserService的模拟对象 val mockUserService = mockk<UserService>() val userId = "123" val expectedUserName = "John Doe" // 定义模拟行为,当调用getUserById时返回预期值 every { mockUserService.getUserById(userId) } returns expectedUserName // 创建UserManager,传入模拟的UserService val userManager = UserManager(mockUserService) // 调用方法并验证返回值 val result = userManager.getUserNameById(userId) assertEquals(expectedUserName, result) // 验证方法被调用 verify { mockUserService.getUserById(userId) } } @Test fun `test getUserNameById with exception`() { // 创建UserService的模拟对象 val mockUserService = mockk<UserService>() val userId = "123" // 定义模拟行为,当调用getUserById时抛出异常 every { mockUserService.getUserById(userId) } throws RuntimeException("Service error") // 创建UserManager,传入模拟的UserService val userManager = UserManager(mockUserService) // 验证调用方法时抛出异常 assertThrows<RuntimeException> { userManager.getUserNameById(userId) } // 验证方法被调用 verify { mockUserService.getUserById(userId) } } }
- 代码说明:
- 创建模拟对象:通过
mockk<UserService>()
创建UserService
接口的模拟对象。 - 定义模拟行为:
- 使用
every { mockUserService.getUserById(userId) } returns expectedUserName
来定义当getUserById
方法被调用时返回特定值。 - 使用
every { mockUserService.getUserById(userId) } throws RuntimeException("Service error")
来定义当getUserById
方法被调用时抛出特定异常。
- 使用
- 测试验证:
- 使用
assertEquals
验证方法返回值是否符合预期。 - 使用
assertThrows
验证方法是否抛出预期异常。 - 使用
verify
验证方法是否被调用,确保模拟对象的方法在测试过程中被正确调用。
- 使用
- 创建模拟对象:通过