1

我想扩展验证以允许检查同一个模拟对象上的多个命令,但它不起作用,它编译但在运行时它不会运行每个命令。

只是想避免写更多的东西,比如:

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)
}

但是这些都不起作用,即使我不调用演示者中的方法,所有测试都通过了,我该怎么做?

4

3 回答 3

3

我遇到了同样的问题,并围绕 Mockito 编写了 Facade。我的库允许验证围绕一个模拟对象的少量调用:

val list = mock(MutableList::class)

list.add("String 1")
list.add("String 2")
list.size()

verify(list) {
    times(2).add(anyString())
    times(1).size()
}

请看自述文件,也许它可以帮助你

于 2016-02-18T15:59:59.800 回答
2

如我错了请纠正我。您希望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()并需要适当地使用它(将其用作函数,而不是对象)。

于 2016-02-18T15:56:30.923 回答
0

你应该那样做。verify必须在每个模拟方法调用之前调用。

于 2016-02-18T14:52:08.860 回答