我想在我的测试中模拟一个属性 setter ,但我找不到任何关于如何做到这一点的信息。到目前为止,这是我尝试过的:
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
return@then 15
}
else
{
// this never gets called
temp = invocation.getArgument(0)
null
}
}
}
}
注意:我正在使用 com.nhaarman.mockito_kotlin 库
最佳答案
一个有点丑陋但可行的模拟 setter 的解决方案,使用绑定(bind)属性引用来获取 setter:
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()
方法。
@Mock private lateinit var fooMock: Foo
private val fooMock: Foo = mock()
关于unit-testing - 模拟属性 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178022/