2017-05-25 125 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