diff --git a/mockk/common/src/main/kotlin/io/mockk/impl/stub/MockKStub.kt b/mockk/common/src/main/kotlin/io/mockk/impl/stub/MockKStub.kt index c008dce56..cfea60af0 100644 --- a/mockk/common/src/main/kotlin/io/mockk/impl/stub/MockKStub.kt +++ b/mockk/common/src/main/kotlin/io/mockk/impl/stub/MockKStub.kt @@ -18,7 +18,6 @@ open class MockKStub( val log = gatewayAccess.safeToString(Logger()) private val answers = InternalPlatform.synchronizedMutableList() - private val answerUsages = InternalPlatform.synchronizedMutableMap() private val childs = InternalPlatform.synchronizedMutableMap() private val recordedCalls = InternalPlatform.synchronizedMutableList() private val recordedCallsByMethod = @@ -31,17 +30,15 @@ open class MockKStub( var disposeRoutine: () -> Unit = {} override fun addAnswer(matcher: InvocationMatcher, answer: Answer<*>) { - val invocationAnswer = InvocationAnswer(matcher, answer) + val invocationAnswer = InvocationAnswer(matcher, answer, 0) answers.add(invocationAnswer) - answerUsages[invocationAnswer] = 0 } override fun answer(invocation: Invocation): Any? { val invocationAndMatcher = InternalPlatform.synchronized(answers) { answers - .reversed() - .firstOrNull { it.matcher.match(invocation) } - ?.also { answerUsages[it] = answerUsages[it]!! + 1 } + .findLast { it.matcher.match(invocation) } + ?.also { it.usageCount++ } } ?: return defaultAnswer(invocation) return with(invocationAndMatcher) { @@ -192,7 +189,7 @@ open class MockKStub( override fun matcherUsages(): Map = InternalPlatform.synchronized(answers) { - answerUsages.mapKeys { it.key.matcher } + answers.associate { it.matcher to it.usageCount } } override fun toStr() = "${type.simpleName}($name)" @@ -277,7 +274,6 @@ open class MockKStub( override fun clear(options: MockKGateway.ClearOptions) { if (options.answers) { this.answers.clear() - this.answerUsages.clear() } if (options.recordedCalls) { this.recordedCalls.clear() @@ -298,7 +294,7 @@ open class MockKStub( val childOfRegex = Regex("child(\\^(\\d+))? of (.+)") } - private data class InvocationAnswer(val matcher: InvocationMatcher, val answer: Answer<*>) + private data class InvocationAnswer(val matcher: InvocationMatcher, val answer: Answer<*>, var usageCount: Int) protected fun Invocation.allEqMatcher() = InvocationMatcher( diff --git a/mockk/jvm/src/test/kotlin/io/mockk/it/VerificationAcknowledgeTest.kt b/mockk/jvm/src/test/kotlin/io/mockk/it/VerificationAcknowledgeTest.kt index c67636ab5..4a5fee58d 100644 --- a/mockk/jvm/src/test/kotlin/io/mockk/it/VerificationAcknowledgeTest.kt +++ b/mockk/jvm/src/test/kotlin/io/mockk/it/VerificationAcknowledgeTest.kt @@ -75,6 +75,7 @@ class VerificationAcknowledgeTest { @Test fun `checkUnnecessaryStubAll with single call to each stub`() { + clearAllMocks() // ensure that previous tests haven't created unnecessary stubs doCalls1() val mock2 = mockk() every { mock2.op(98) } returns 1 @@ -84,6 +85,7 @@ class VerificationAcknowledgeTest { @Test fun `checkUnnecessaryStubAll with some used and some unused stubs`() { + clearAllMocks() // ensure that previous tests haven't created unnecessary stubs doCalls1() val mock2 = mockk { every { op(42) } returns 1 } assertFailsWith {