鉴于此代码:
// Subject.kt
open class Subject(var x: Int) {
constructor(): this(42) {
println("made it")
}
fun doit() {
x += 1
println("did it: $x")
}
}
// Tests.kt
import org.junit.jupiter.api.Test
import org.mockito.Mockito
class Tests {
@Test
fun makeit() {
val mock = Mockito.mock(Subject::class.java)
val details = Mockito.mockingDetails(mock)
println("Is mock: ${details.isMock}")
println("Is spy: ${details.isSpy}")
mock.doit()
mock.doit()
}
}
运行时makeit
,输出为:
Is mock: true
Is spy: false
did it: 1
did it: 2
这似乎表明正在创建主题的某些实例,但绕过了潜在的关键构造函数逻辑。这与“部分模拟”是一致的,但代码并没有做任何事情来请求这样的事情。
我发现这是默认行为令人惊讶,因为文档都强烈警告不要使用部分模拟。我一直无法找到描述何时mock()
返回部分模拟的文档,因此无法弄清楚如何从课程中获得“完整模拟”。
所以:
- 何时
Mockito.mock()
创建部分模拟? - Mockito 可以为班级创建“完整模拟”吗?还是只是为了一个界面?
- 如何请求“完整模拟”?