diff --git a/mockito-kotlin/src/main/kotlin/com/nhaarman/mockitokotlin2/Mocking.kt b/mockito-kotlin/src/main/kotlin/com/nhaarman/mockitokotlin2/Mocking.kt index afc0773e..521575b9 100644 --- a/mockito-kotlin/src/main/kotlin/com/nhaarman/mockitokotlin2/Mocking.kt +++ b/mockito-kotlin/src/main/kotlin/com/nhaarman/mockitokotlin2/Mocking.kt @@ -48,9 +48,10 @@ import kotlin.reflect.KClass * @param stubOnly A stub-only mock does not record method invocations, thus saving memory but disallowing verification of invocations. * @param useConstructor Mockito attempts to use constructor when creating instance of the mock. * @param outerInstance Makes it possible to mock non-static inner classes in conjunction with [useConstructor]. + * @param lenient Lenient mocks bypass "strict stubbing" validation. */ inline fun mock( - extraInterfaces: Array>? = null, + extraInterfaces: Array>? = null, name: String? = null, spiedInstance: Any? = null, defaultAnswer: Answer? = null, @@ -60,7 +61,8 @@ inline fun mock( invocationListeners: Array? = null, stubOnly: Boolean = false, @Incubating useConstructor: UseConstructor? = null, - @Incubating outerInstance: Any? = null + @Incubating outerInstance: Any? = null, + @Incubating lenient: Boolean = false ): T { return Mockito.mock( T::class.java, @@ -75,7 +77,8 @@ inline fun mock( invocationListeners = invocationListeners, stubOnly = stubOnly, useConstructor = useConstructor, - outerInstance = outerInstance + outerInstance = outerInstance, + lenient = lenient ) )!! } @@ -94,9 +97,10 @@ inline fun mock( * @param stubOnly A stub-only mock does not record method invocations, thus saving memory but disallowing verification of invocations. * @param useConstructor Mockito attempts to use constructor when creating instance of the mock. * @param outerInstance Makes it possible to mock non-static inner classes in conjunction with [useConstructor]. + * @param lenient Lenient mocks bypass "strict stubbing" validation. */ inline fun mock( - extraInterfaces: Array>? = null, + extraInterfaces: Array>? = null, name: String? = null, spiedInstance: Any? = null, defaultAnswer: Answer? = null, @@ -107,6 +111,7 @@ inline fun mock( stubOnly: Boolean = false, @Incubating useConstructor: UseConstructor? = null, @Incubating outerInstance: Any? = null, + @Incubating lenient: Boolean = false, stubbing: KStubbing.(T) -> Unit ): T { return Mockito.mock( @@ -122,7 +127,8 @@ inline fun mock( invocationListeners = invocationListeners, stubOnly = stubOnly, useConstructor = useConstructor, - outerInstance = outerInstance + outerInstance = outerInstance, + lenient = lenient ) ).apply { KStubbing(this).stubbing(this) }!! } @@ -142,9 +148,10 @@ inline fun mock( * @param stubOnly A stub-only mock does not record method invocations, thus saving memory but disallowing verification of invocations. * @param useConstructor Mockito attempts to use constructor when creating instance of the mock. * @param outerInstance Makes it possible to mock non-static inner classes in conjunction with [useConstructor]. + * @param lenient Lenient mocks bypass "strict stubbing" validation. */ fun withSettings( - extraInterfaces: Array>? = null, + extraInterfaces: Array>? = null, name: String? = null, spiedInstance: Any? = null, defaultAnswer: Answer? = null, @@ -154,7 +161,8 @@ fun withSettings( invocationListeners: Array? = null, stubOnly: Boolean = false, @Incubating useConstructor: UseConstructor? = null, - @Incubating outerInstance: Any? = null + @Incubating outerInstance: Any? = null, + @Incubating lenient: Boolean = false ): MockSettings = Mockito.withSettings().apply { extraInterfaces?.let { extraInterfaces(*it.map { it.java }.toTypedArray()) } name?.let { name(it) } @@ -167,6 +175,7 @@ fun withSettings( if (stubOnly) stubOnly() useConstructor?.let { useConstructor(*it.args) } outerInstance?.let { outerInstance(it) } + if (lenient) lenient() } class UseConstructor private constructor(val args: Array) { diff --git a/tests/src/test/kotlin/test/MockingTest.kt b/tests/src/test/kotlin/test/MockingTest.kt index 5a45d1e4..0bb19ce7 100644 --- a/tests/src/test/kotlin/test/MockingTest.kt +++ b/tests/src/test/kotlin/test/MockingTest.kt @@ -3,10 +3,12 @@ package test import com.nhaarman.expect.expect import com.nhaarman.expect.expectErrorWithMessage import com.nhaarman.expect.fail -import com.nhaarman.mockitokotlin2.* -import com.nhaarman.mockitokotlin2.UseConstructor.Companion import com.nhaarman.mockitokotlin2.UseConstructor.Companion.parameterless import com.nhaarman.mockitokotlin2.UseConstructor.Companion.withArguments +import com.nhaarman.mockitokotlin2.doReturn +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.verify +import com.nhaarman.mockitokotlin2.whenever import org.junit.Test import org.mockito.Mockito import org.mockito.exceptions.verification.WantedButNotInvoked @@ -255,6 +257,20 @@ class MockingTest : TestBase() { } } + @Test + fun mockStubbing_withSettingsAPIAndStubbing_name() { + /* Given */ + val mock = mock(name = "myName") { + on { nullableStringResult() } doReturn "foo" + } + + /* When */ + val result = mock.nullableStringResult() + + /* Then */ + expect(result).toBe("foo") + } + @Test fun mockStubbing_withSettingsAPI_defaultAnswer() { /* Given */