From 8ea5be1db421f457a01ef2175bfdf86516c491fd Mon Sep 17 00:00:00 2001 From: Jonathan Lagneaux Date: Sun, 8 Oct 2023 17:02:18 +0200 Subject: [PATCH] Fix wasNotshould throw exception when called on non mocked object Closes #1155 --- .../src/commonMain/kotlin/io/mockk/API.kt | 12 ++++++ .../recording/states/StubbingStateTest.kt | 4 +- .../kotlin/io/mockk/it/ConstructorMockTest.kt | 4 +- .../kotlin/io/mockk/it/WasNotCalledTest.kt | 38 +++++++++++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 modules/mockk/src/commonTest/kotlin/io/mockk/it/WasNotCalledTest.kt diff --git a/modules/mockk-dsl/src/commonMain/kotlin/io/mockk/API.kt b/modules/mockk-dsl/src/commonMain/kotlin/io/mockk/API.kt index 047e1c324..299282ee4 100644 --- a/modules/mockk-dsl/src/commonMain/kotlin/io/mockk/API.kt +++ b/modules/mockk-dsl/src/commonMain/kotlin/io/mockk/API.kt @@ -2166,6 +2166,18 @@ class MockKVerificationScope( @Suppress("UNUSED_PARAMETER") infix fun List.wasNot(called: Called) { + if (!all { + MockKDsl.internalIsMockKMock( + mock = it, + regular = true, + spy = true, + objectMock = true, + staticMock = true, + constructorMock = true + ) + }) { + throw MockKException("was not can only be called on a mocked object") + } callRecorder.wasNotCalled(this) } } diff --git a/modules/mockk/src/commonTest/kotlin/io/mockk/impl/recording/states/StubbingStateTest.kt b/modules/mockk/src/commonTest/kotlin/io/mockk/impl/recording/states/StubbingStateTest.kt index fdd964829..50762421d 100644 --- a/modules/mockk/src/commonTest/kotlin/io/mockk/impl/recording/states/StubbingStateTest.kt +++ b/modules/mockk/src/commonTest/kotlin/io/mockk/impl/recording/states/StubbingStateTest.kt @@ -25,9 +25,7 @@ class StubbingStateTest { state.recordingDone() } - verify { - recorder.factories.stubbingAwaitingAnswerState wasNot Called - } + verify(exactly = 0) { recorder.factories.stubbingAwaitingAnswerState(any()) } } @Test diff --git a/modules/mockk/src/commonTest/kotlin/io/mockk/it/ConstructorMockTest.kt b/modules/mockk/src/commonTest/kotlin/io/mockk/it/ConstructorMockTest.kt index 848d6f52b..6e8c7f526 100644 --- a/modules/mockk/src/commonTest/kotlin/io/mockk/it/ConstructorMockTest.kt +++ b/modules/mockk/src/commonTest/kotlin/io/mockk/it/ConstructorMockTest.kt @@ -1,6 +1,7 @@ package io.mockk.it import io.mockk.* +import kotlin.test.Ignore import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith @@ -86,6 +87,7 @@ class ConstructorMockTest { } @Test + @Ignore // TODO fix verify bug an anyConstructed https://github.com/mockk/mockk/issues/1224 fun clear() { mockkConstructor(MockCls::class) @@ -97,7 +99,7 @@ class ConstructorMockTest { clearConstructorMockk(MockCls::class) - verify { anyConstructed() wasNot Called } + verify(exactly = 0) { anyConstructed() } assertEquals(3, MockCls().op(1, 2)) diff --git a/modules/mockk/src/commonTest/kotlin/io/mockk/it/WasNotCalledTest.kt b/modules/mockk/src/commonTest/kotlin/io/mockk/it/WasNotCalledTest.kt new file mode 100644 index 000000000..5ca2a3cc3 --- /dev/null +++ b/modules/mockk/src/commonTest/kotlin/io/mockk/it/WasNotCalledTest.kt @@ -0,0 +1,38 @@ +package io.mockk.it + +import io.mockk.* +import kotlinx.coroutines.flow.flowOf +import org.junit.jupiter.api.BeforeEach +import kotlin.test.Test +import kotlin.test.assertFailsWith + +class WasNotCalledTest { + + val mock = mockk() + + @Test + fun wasNotCalledOnNonMockedObject() { + assertFailsWith("was not can should throw MockKException on non mock object") { + verify { mock.flowOp(1, 2) wasNot Called } + } + } + + @Test + fun wasNotCalledOnMockedObject() { + verify { mock wasNot Called } + } + + @Test + fun wasNotCalledShouldThrowAssertionErrorIfMockHasBeenCalled() { + assertFailsWith("was not can should throw AssertionError if mock has been called") { + every { mock.flowOp(1, 2) } returns flowOf(1, 2) + + mock.flowOp(1, 2) + verify { mock wasNot Called } + } + } + + class MockCls { + fun flowOp(a: Int = 1, b: Int = 2) = flowOf(a, b) + } +}