2017-05-25 124 views
1

我想在我的測試中嘲笑一個屬性設置器,但是我無法找到關於它如何執行的任何事情。以下是我迄今爲止嘗試:模擬屬性設置器

interface Foo 
{ 
    var property: Int 
} 

@RunWith(MockitoJUnitRunner::class) 
class TestClass 
{ 
    @Mock private val fooMock: Foo = mock() 
    private var temp = 0 

    @Before 
    fun setup() 
    { 
     whenever(fooMock.property).then { 
      invocation -> 
      if (invocation.arguments.isEmpty()) 
      { 
       // this part works fine 
       [email protected] 15 
      } 
      else 
      { 
       // this never gets called 
       temp = invocation.getArgument(0) 
       null 
      } 
     } 
    } 
} 

注:我使用com.nhaarman.mockito_kotlin庫

回答

1

稍微難看,但嘲諷二傳手工作的解決方案,使用綁定屬性參考拿到二傳手:

whenever(fooMock::property.setter.invoke(any())).then { 
    println("setter called with ${it.arguments[0]}") 
} 

一些替代方案:

如果您想驗證一個屬性設置爲給定值,你可以做到以下幾點:

fooMock.property = 25 

verify(fooMock).property = 25 

如果你想捕捉的值的屬性設置,你可以使用一個ArgumentCaptor,像這樣:

class TestClass { 
    @Mock private lateinit var fooMock: Foo 
    @Captor private lateinit var captor: ArgumentCaptor<Int> 

    @Test 
    fun test() { 
     fooMock.property = 25 

     verify(fooMock).property = capture(captor) 

     assertEquals(25, captor.value) 
    } 
} 

對於一般的Mockito提示:這兩條線都創建一個模擬,你不需要同時使用@Mock註釋和mock()方法。

@Mock private lateinit var fooMock: Foo 

private val fooMock: Foo = mock() 
+0

令人難以置信的謝謝!我知道驗證和捕獲,在我的情況下,這是不夠的。該屬性被訪問兩次,並在同一個函數調用之間設置一次,我需要模擬它。也不知道我可以跳過annonation :) – rozina