2016-02-18 97 views
1

我想擴展驗證以允許通過相同的模擬對象檢查多個命令,但它不工作,它編譯但運行時不運行每個命令一樣。擴展Mockito驗證Kotlin無法正常工作(以「kotlin方式」)

只是想避免編寫更多的東西,如:

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

但這些都不起作用,即使我不在主持人中調用方法,所有測試都會通過,我該怎麼做?

回答

3

我有同樣的問題,並寫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() 
} 

請看自述,也許它可以幫助你

0

你應該這樣做。必須在每個模擬方法調用之前調用verify

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()需要用它適當地(使用它作爲函數,而不是對象) 。