扩展 Mockito 验证 Kotlin 不工作(在 "kotlin way" 中)
Extend Mockito verify for Kotlin not working (in a "kotlin way")
我想扩展验证以允许在同一个模拟对象上检查多个命令,但它不工作,它编译但在 运行 它不会 运行 每个命令都在同一个对象上。
只是想避免写更多类似的东西:
Mockito.verify(mockedView).initViews()
Mockito.verify(mockedView).setImage(user.photoUrl)
并写得更像:
Mockito.verify(mockedView){
initViews()
setImage(user.photoUrl)
}
第一次尝试:
@Test
fun onCreate_loadLoginInfo() {
val user = MockUser.user()
presenter.onCreate(mockedView, user)
Mockito.myVerify(mockedView) {
initViews()
setImage(user.photoUrl)
setName(user.name)
setEmail(user.email)
}
}
class Mockito {
companion object
}
fun <T> Mockito.Companion.myVerify(obj: T, func: T.() -> Unit) {
org.mockito.Mockito.verify(obj).func()
}
第二次尝试:
@Test
fun onCreate_loadLoginInfo() {
val user = MockUser.user()
presenter.onCreate(mockedView, user)
Mockito.myVerify(mockedView) {
it.initViews()
it.setImage(user.photoUrl)
it.setName(user.name)
it.setEmail(user.email)
}
}
class Mockito {
companion object
}
fun <T> Mockito.Companion.myVerify(obj: T, func: (T) -> Unit) {
val mock = org.mockito.Mockito.verify(obj)
func(mock)
}
但是这些都不起作用,即使我不调用演示器中的方法,所有测试都通过了,我该怎么做?
你应该这样做。 verify
必须在每次模拟方法调用之前调用。
如果我错了请纠正我。您希望在测试中避免多次 verify()
调用。
@Test fun onCreate_loadLoginInfo() {
// ...
verify(mockedView).initViews()
verify(mockedView).setImage(user.photoUrl)
verify(mockedView).setName(user.name)
verify(mockedView).setEmail(user.email)
}
我稍微修改了你的第二种方法:
@Test fun onCreate_loadLoginInfo() {
// ...
verifyAll(mockedView) {
it().initViews()
it().setImage(user.photoUrl)
it().setName(user.name)
it().setEmail(user.email)
}
}
fun <T> verifyAll(mock: T, func: (() -> T) -> Unit) {
func { Mockito.verify(mock) }
}
如您所见,我们正在将函数参数传递给 func()
并且需要适当地使用它(将其用作函数,而不是对象)。
我遇到了同样的问题,写了Facade around Mockito。
我的库允许验证围绕一个模拟对象的几个调用:
val list = mock(MutableList::class)
list.add("String 1")
list.add("String 2")
list.size()
verify(list) {
times(2).add(anyString())
times(1).size()
}
请查看自述文件,也许它可以帮助您
我想扩展验证以允许在同一个模拟对象上检查多个命令,但它不工作,它编译但在 运行 它不会 运行 每个命令都在同一个对象上。
只是想避免写更多类似的东西:
Mockito.verify(mockedView).initViews()
Mockito.verify(mockedView).setImage(user.photoUrl)
并写得更像:
Mockito.verify(mockedView){
initViews()
setImage(user.photoUrl)
}
第一次尝试:
@Test
fun onCreate_loadLoginInfo() {
val user = MockUser.user()
presenter.onCreate(mockedView, user)
Mockito.myVerify(mockedView) {
initViews()
setImage(user.photoUrl)
setName(user.name)
setEmail(user.email)
}
}
class Mockito {
companion object
}
fun <T> Mockito.Companion.myVerify(obj: T, func: T.() -> Unit) {
org.mockito.Mockito.verify(obj).func()
}
第二次尝试:
@Test
fun onCreate_loadLoginInfo() {
val user = MockUser.user()
presenter.onCreate(mockedView, user)
Mockito.myVerify(mockedView) {
it.initViews()
it.setImage(user.photoUrl)
it.setName(user.name)
it.setEmail(user.email)
}
}
class Mockito {
companion object
}
fun <T> Mockito.Companion.myVerify(obj: T, func: (T) -> Unit) {
val mock = org.mockito.Mockito.verify(obj)
func(mock)
}
但是这些都不起作用,即使我不调用演示器中的方法,所有测试都通过了,我该怎么做?
你应该这样做。 verify
必须在每次模拟方法调用之前调用。
如果我错了请纠正我。您希望在测试中避免多次 verify()
调用。
@Test fun onCreate_loadLoginInfo() {
// ...
verify(mockedView).initViews()
verify(mockedView).setImage(user.photoUrl)
verify(mockedView).setName(user.name)
verify(mockedView).setEmail(user.email)
}
我稍微修改了你的第二种方法:
@Test fun onCreate_loadLoginInfo() {
// ...
verifyAll(mockedView) {
it().initViews()
it().setImage(user.photoUrl)
it().setName(user.name)
it().setEmail(user.email)
}
}
fun <T> verifyAll(mock: T, func: (() -> T) -> Unit) {
func { Mockito.verify(mock) }
}
如您所见,我们正在将函数参数传递给 func()
并且需要适当地使用它(将其用作函数,而不是对象)。
我遇到了同样的问题,写了Facade around Mockito。 我的库允许验证围绕一个模拟对象的几个调用:
val list = mock(MutableList::class)
list.add("String 1")
list.add("String 2")
list.size()
verify(list) {
times(2).add(anyString())
times(1).size()
}
请查看自述文件,也许它可以帮助您