unit-testing - 模拟属性 setter

标签 unit-testing mockito kotlin

我想在我的测试中模拟一个属性 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/

相关文章:

android - 在按钮上同时使用 setOnTouchListener 和 setOnClickListener

java - 使用人工数据设置和播种数据库以进行集成测试的正确方法是什么

unit-testing - 带有 Spock Framework Mock "_"选项的 Groovy Spread Operator

reactjs - React 单元测试传单

java - Spring MVC Rest 中的单元测试 - 转换问题

使用 Java 模块构建 Gradle Kotlin DSL 多项目

java - 如何测试一个构造函数会抛出非法状态异常?

javascript - 如何访问从模拟库返回的模拟方法

java - 如何使用 hamcrest 断言 Set 具有具有确切属性的项目

java - 是否可以使用 @Spy 表示法在 Mockito 中声明但不能实例化一个 spy 对象?