面试题答案
一键面试使用MockK进行模拟测试
- 引入依赖:在
build.gradle.kts
文件中添加MockK依赖:
testImplementation("io.mockk:mockk:1.13.5")
- 创建测试类:假设业务逻辑类为
ComplexBusinessLogic
,依赖Dependency1
、Dependency2
接口。
import io.mockk.*
import org.junit.jupiter.api.Test
import kotlin.test.*
class ComplexBusinessLogicTest {
@Test
fun `test complex business logic with MockK`() {
// 1. 模拟依赖
val mockDependency1: Dependency1 = mockk()
val mockDependency2: Dependency2 = mockk()
// 2. 处理依赖之间的相互关系(如果有)
// 例如,假设Dependency1的某个方法返回Dependency2的实例
every { mockDependency1.getDependency2() } returns mockDependency2
// 3. 创建业务逻辑类实例,传入模拟依赖
val businessLogic = ComplexBusinessLogic(mockDependency1, mockDependency2)
// 4. 模拟复杂的方法调用
val expectedResult = "mocked result"
every { mockDependency2.someComplexMethod() } returns expectedResult
// 5. 调用业务逻辑方法并断言
val result = businessLogic.execute()
assertEquals(expectedResult, result)
}
}
interface Dependency1 {
fun getDependency2(): Dependency2
}
interface Dependency2 {
fun someComplexMethod(): String
}
class ComplexBusinessLogic(private val dependency1: Dependency1, private val dependency2: Dependency2) {
fun execute(): String {
// 实际业务逻辑,例如调用dependency1和dependency2的方法
return dependency2.someComplexMethod()
}
}
使用Mockito进行模拟测试
- 引入依赖:在
build.gradle.kts
文件中添加Mockito依赖:
testImplementation("org.mockito:mockito-core:4.11.0")
- 创建测试类:同样针对
ComplexBusinessLogic
类。
import org.junit.jupiter.api.Test
import org.mockito.Mockito.*
import kotlin.test.*
class ComplexBusinessLogicMockitoTest {
@Test
fun `test complex business logic with Mockito`() {
// 1. 模拟依赖
val mockDependency1: Dependency1 = mock(Dependency1::class.java)
val mockDependency2: Dependency2 = mock(Dependency2::class.java)
// 2. 处理依赖之间的相互关系(如果有)
// 例如,假设Dependency1的某个方法返回Dependency2的实例
`when`(mockDependency1.getDependency2()).thenReturn(mockDependency2)
// 3. 创建业务逻辑类实例,传入模拟依赖
val businessLogic = ComplexBusinessLogic(mockDependency1, mockDependency2)
// 4. 模拟复杂的方法调用
val expectedResult = "mocked result"
`when`(mockDependency2.someComplexMethod()).thenReturn(expectedResult)
// 5. 调用业务逻辑方法并断言
val result = businessLogic.execute()
assertEquals(expectedResult, result)
}
}
interface Dependency1 {
fun getDependency2(): Dependency2
}
interface Dependency2 {
fun someComplexMethod(): String
}
class ComplexBusinessLogic(private val dependency1: Dependency1, private val dependency2: Dependency2) {
fun execute(): String {
// 实际业务逻辑,例如调用dependency1和dependency2的方法
return dependency2.someComplexMethod()
}
}
在这两种框架中,MockK使用更简洁的DSL语法,而Mockito使用经典的when - thenReturn
语法。两者在处理依赖之间的关系和复杂方法调用时思路相似,都是先模拟出依赖对象,再设定依赖对象之间的交互行为以及方法调用的返回值,最后使用模拟依赖创建业务逻辑类实例并进行测试。