Kotlin: how to mock a static Companion method using MockK
Introduction
How do you mock a static companion method in Kotlin using MockK?
I wanted to mock this (static) method in a companion object in Kotlin in class MyClass:
companion object {
fun isNegativeAndFromSavingsAccount(amount: BigDecimal, accountType: accountType) = amount < BigDecimal.ZERO && accountType == AccountType.SAVINGS
}
Trying it with a regular 'every' like this doesn't work:
every { Declaration.isNegativeAndFromSavingsAccount(any(), any()) } returns false
Note it does compile fine!
But when running the test, you'll get this error:
io.mockk.MockKException: Failed matching mocking signature for left matchers: [any(), any()]
at io.mockk.impl.recording.SignatureMatcherDetector.detect(SignatureMatcherDetector.kt:97)
Setup:
- Kotlin 1.9
- MockK 1.13.7
Solution
This is the way it does work:
import io.mockk.mockkObject
mockkObject(Declaration.Companion) {
every { MyClass.isNegativeAndFromSavingsAccount(any(), any()) } returns false
}
Note this did not work, got the same error:
mockkObject(Declaration::class)
every { MyClass.isNegativeAndFromSavingsAccount(any(), any()) } returns false
I found several posts, but none of them gave a clear answer and/or were using some older version of MockK. E.g: https://github.com/mockk/mockk/issues/61
and this StackOverflow post.
Some more examples and variants of solutions can be found here, e.g when using @JvmStatic.