Skip to content

Commit c523b9c

Browse files
jselboJoshua Selbo
andauthored
Add wrappers for mockStatic, mockConstruction (#551)
Co-authored-by: Joshua Selbo <[email protected]>
1 parent 0fda817 commit c523b9c

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

mockito-kotlin/src/main/kotlin/org/mockito/kotlin/MockedStatic.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@
2626
package org.mockito.kotlin
2727

2828
import org.mockito.MockedStatic
29+
import org.mockito.stubbing.OngoingStubbing
2930
import org.mockito.verification.VerificationMode
3031

32+
fun <S, T> MockedStatic<T>.whenever(verification: () -> S): OngoingStubbing<S> =
33+
`when` { verification() }
34+
3135
/**
3236
* Syntax sugar to enable [SAM conversion syntax](https://kotlinlang.org/docs/java-interop.html#sam-conversions)
3337
* for [MockedStatic.verify] with a [VerificationMode].

mockito-kotlin/src/main/kotlin/org/mockito/kotlin/Mocking.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ package org.mockito.kotlin
2727

2828
import org.mockito.Incubating
2929
import org.mockito.MockSettings
30+
import org.mockito.MockedConstruction
31+
import org.mockito.MockedStatic
3032
import org.mockito.Mockito
3133
import org.mockito.listeners.InvocationListener
3234
import org.mockito.mock.SerializableMode
@@ -179,6 +181,34 @@ fun withSettings(
179181
if (lenient) strictness(Strictness.LENIENT)
180182
}
181183

184+
/**
185+
* Creates a thread-local mock for static methods on [T].
186+
*
187+
* @see Mockito.mockStatic
188+
*/
189+
inline fun <reified T> mockStatic(): MockedStatic<T> {
190+
return Mockito.mockStatic(T::class.java)
191+
}
192+
193+
/**
194+
* Creates a thread-local mock for constructions of [T].
195+
*
196+
* @see Mockito.mockConstruction
197+
*/
198+
inline fun <reified T> mockConstruction(): MockedConstruction<T> {
199+
return Mockito.mockConstruction(T::class.java)
200+
}
201+
202+
/**
203+
* Creates a thread-local mock for constructions of [T].
204+
*
205+
* @param mockInitializer a callback to prepare the methods on a mock after its instantiation
206+
* @see Mockito.mockConstruction
207+
*/
208+
inline fun <reified T> mockConstruction(mockInitializer: MockedConstruction.MockInitializer<T>): MockedConstruction<T> {
209+
return Mockito.mockConstruction(T::class.java, mockInitializer)
210+
}
211+
182212
class UseConstructor private constructor(val args: Array<Any>) {
183213

184214
companion object {

tests/src/test/kotlin/test/Classes.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,7 @@ class ThrowableClass(cause: Throwable) : Throwable(cause)
133133
object SomeObject {
134134
@JvmStatic
135135
fun aStaticMethod() {}
136+
137+
@JvmStatic
138+
fun aStaticMethodReturningString(): String = "Some Value"
136139
}

tests/src/test/kotlin/test/MockingTest.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import org.mockito.Mockito
1616
import org.mockito.exceptions.verification.WantedButNotInvoked
1717
import org.mockito.invocation.DescribedInvocation
1818
import org.mockito.kotlin.argumentCaptor
19+
import org.mockito.kotlin.mockConstruction
20+
import org.mockito.kotlin.mockStatic
1921
import org.mockito.listeners.InvocationListener
2022
import org.mockito.mock.SerializableMode.BASIC
2123
import java.io.PrintStream
@@ -388,6 +390,39 @@ class MockingTest : TestBase() {
388390
}
389391
}
390392

393+
@Test
394+
fun mockStatic_stubbing() {
395+
mockStatic<SomeObject>().use { mockedStatic ->
396+
mockedStatic.whenever { SomeObject.aStaticMethodReturningString() }.thenReturn("Hello")
397+
398+
expect(SomeObject.aStaticMethodReturningString()).toBe("Hello")
399+
400+
mockedStatic.verify { SomeObject.aStaticMethodReturningString() }
401+
}
402+
}
403+
404+
@Test
405+
fun mockConstruction_basic() {
406+
mockConstruction<Open>().use { mockedConstruction ->
407+
val open = Open()
408+
409+
expect(mockedConstruction.constructed()).toHaveSize(1)
410+
expect(mockedConstruction.constructed().first()).toBeTheSameAs(open)
411+
}
412+
}
413+
414+
@Test
415+
fun mockConstruction_withInitializer() {
416+
mockConstruction<Open> { mock, _ ->
417+
whenever(mock.stringResult()).thenReturn("Hello")
418+
}.use {
419+
val open = Open()
420+
421+
expect(open.stringResult()).toBe("Hello")
422+
}
423+
}
424+
425+
391426
private interface MyInterface
392427
private open class MyClass
393428
}

0 commit comments

Comments
 (0)