单元测试扩展功能并模拟该类的其他方法

时间:2018-09-06 15:11:59

标签: kotlin kotlin-extension

我正在编写扩展功能,为AmazonKinesis.putRecords添加了一些重试功能。在我的扩展方法中,我执行了一些逻辑并调用了原始的putRecords方法:

fun AmazonKinesis.putRecordsWithRetry(records: List<PutRecordsRequestEntry>, streamName: String) {
    //...
    val putRecordResult = this.putRecords(PutRecordsRequest().withStreamName(streamName).withRecords(records))
   //...
}

从单元测试的角度来看,我很难理解如何模拟对this.putRecords的调用

我正在使用com.nhaarman.mockitokotlin2.*

val successfulRequest = PutRecordsResultEntry().withErrorCode(null);

class KinesisExtensionTest : StringSpec({
    val testRecords = ArrayList<PutRecordsRequestEntry>()
    testRecords.add(PutRecordsRequestEntry().withPartitionKey("iAmABunny").withData(ByteBuffer.wrap("aaa".toByteArray()))
    )

    val kinesis = mock<AmazonKinesis>{
        on { putRecordsWithRetry(testRecords, "/dev/null") }.thenCallRealMethod()
        on { putRecords(any()) }.thenReturn(PutRecordsResult().withRecords(listOf(successfulRequest, successfulRequest)))
    }


    "can write a record" {
        kinesis.putRecordsWithRetry(testRecords, "/dev/null")
        verify(kinesis).putRecord(any())
    }
})

putRecordResult始终为空

1 个答案:

答案 0 :(得分:0)

扩展功能AmazonKinesis.putRecordsWithRetry将被编译为Mockito doesn't support static method mocking yet内部的静态函数。

因此Mockito在验证步骤可能不知道存根信息,因此会产生默认的null值。