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

unit testing extension function and mocking the other methods of the class

我正在编写一个扩展函数,向 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 始终为 null

扩展函数 AmazonKinesis.putRecordsWithRetry 将在后台编译为静态函数,Mockito doesn't support static method mocking yet

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