模拟私人财产

时间:2018-07-13 00:19:40

标签: mockk

让我们说我们有一个这样的班级:

class Whatever {
    private var something = false

    fun aMethod(): Int {
        return if( something ) {
            1
        } else {
            0
        }
    }
}

根据documentation,看来我应该能够执行以下操作:

val classUnderTest = spyk(Whatever())

every { classUnderTest getProperty "something" } returns true

assertThat(classUnderTest.aMethod()).isEqualTo(1)

但是我得到了错误:io.mockk.MockKException: Missing calls inside every { ... } block

我正在使用模拟1.8.5,kotlin 1.2.51

3 个答案:

答案 0 :(得分:1)

尝试使用答案代替回报,例如:

CREATE FUNCTION dbo.HashCheeseName (@CheeseName NVARCHAR(40)) 
RETURNS varbinary(8000)
AS BEGIN
    DECLARE @Salt VARCHAR(25);
    DECLARE @CheeseName NVARCHAR(40);
    DECLARE @output varbinary(8000) ;
    SET @Salt = '123abc11aa';

    SET @output = HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt);
    RETURN @output;
END

答案 1 :(得分:0)

您可以使用此小扩展名

overflow-y: hidden;

它设置作为参数传递的相同类型的第一个字段的值,并且可以使用多个参数,例如:

fun Any.mockPrivateFields(vararg mocks: Any): Any {
    mocks.forEach { mock ->
        javaClass.declaredFields
                .filter { it.modifiers.and(Modifier.PRIVATE) > 0 || it.modifiers.and(Modifier.PROTECTED) > 0 }
                .firstOrNull { it.type == mock.javaClass}
                ?.also { it.isAccessible = true }
                ?.set(this, mock)
    }
    return this
}

它将模拟找到的第一个Int字段和找到的第一个String字段。

这仅适用于私有/受保护的字段。

您可以对其进行修改,以支持相同类型的多个字段。我没有尝试使用泛型,但是我想支持它并不难。

答案 2 :(得分:0)

这可能是因为 kotlin 编译器为您的 something 属性设置了 there is no getter/setter created

如果您将其修改为如下所示会怎样?

class Whatever {
    private val something
        get() = false

    fun aMethod(): Int {
        return if( something ) {
            1
        } else {
            0
        }
    }
}