diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml
index e3f69b4ea9..3d2c7337b0 100644
--- a/kotlin-libraries/pom.xml
+++ b/kotlin-libraries/pom.xml
@@ -140,6 +140,32 @@
kotlinx-collections-immutable
0.1
+
+
+
+ io.mockk
+ mockk
+ ${mockk.version}
+ test
+
+
+ net.bytebuddy
+ byte-buddy
+ 1.8.13
+ compile
+
+
+ net.bytebuddy
+ byte-buddy-agent
+ 1.8.13
+ compile
+
+
+ org.objenesis
+ objenesis
+ 2.6
+ compile
+
@@ -154,6 +180,7 @@
3.10.0
1.4.197
0.10.4
+ 1.9.3
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
new file mode 100644
index 0000000000..56cd8b43eb
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
@@ -0,0 +1,44 @@
+package com.baeldung.mockk
+
+import io.mockk.MockKAnnotations
+import io.mockk.every
+import io.mockk.impl.annotations.InjectMockKs
+import io.mockk.impl.annotations.MockK
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+
+class InjectTestService {
+ lateinit var service1: TestableService
+ lateinit var service2: TestableService
+
+ fun invokeService1(): String {
+ return service1.getDataFromDb("Test Param")
+ }
+}
+
+class AnnotationMockKUnitTest {
+
+ @MockK
+ lateinit var service1: TestableService
+
+ @MockK
+ lateinit var service2: TestableService
+
+ @InjectMockKs
+ var objectUnderTest = InjectTestService()
+
+ @BeforeEach
+ fun setUp() = MockKAnnotations.init(this)
+
+ @Test
+ fun givenServiceMock_whenCallingMockedMethod_thenCorrectlyVerified() {
+ // given
+ every { service1.getDataFromDb("Test Param") } returns "No"
+ // when
+ val result = objectUnderTest.invokeService1()
+ // then
+ assertEquals("No", result)
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
new file mode 100644
index 0000000000..df4c03be09
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
@@ -0,0 +1,92 @@
+package com.baeldung.mockk
+
+import io.mockk.*
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+
+
+class BasicMockKUnitTest {
+
+ @Test
+ fun givenServiceMock_whenCallingMockedMethod_thenCorrectlyVerified() {
+ // given
+ val service = mockk()
+ every { service.getDataFromDb("Expected Param") } returns "Expected Output"
+ // when
+ val result = service.getDataFromDb("Expected Param")
+ // then
+ verify { service.getDataFromDb("Expected Param") }
+ assertEquals("Expected Output", result)
+ }
+
+ @Test
+ fun givenServiceSpy_whenMockingOnlyOneMethod_thenOtherMethodsShouldBehaveAsOriginalObject() {
+ // given
+ val service = spyk()
+ every { service.getDataFromDb(any()) } returns "Mocked Output"
+ // when checking mocked method
+ val firstResult = service.getDataFromDb("Any Param")
+ // then
+ assertEquals("Mocked Output", firstResult)
+ // when checking not mocked method
+ val secondResult = service.doSomethingElse("Any Param")
+ // then
+ assertEquals("I don't want to!", secondResult)
+ }
+
+ @Test
+ fun givenRelaxedMock_whenCallingNotMockedMethod_thenReturnDefaultValue() {
+ // given
+ val service = mockk(relaxed = true)
+ // when
+ val result = service.getDataFromDb("Any Param")
+ // then
+ assertEquals("", result)
+ }
+
+ @Test
+ fun givenObject_whenMockingIt_thenMockedMethodShouldReturnProperValue() {
+ // given
+ val service = TestableService()
+ mockkObject(service)
+ // when calling not mocked method
+ val firstResult = service.getDataFromDb("Any Param")
+ // then return real response
+ assertEquals("Value from DB", firstResult)
+
+ // when calling mocked method
+ every { service.getDataFromDb(any()) } returns "Mocked Output"
+ val secondResult = service.getDataFromDb("Any Param")
+ // then return mocked response
+ assertEquals("Mocked Output", secondResult)
+ }
+
+ @Test
+ fun givenMock_whenCapturingParamValue_thenProperValueShouldBeCaptured() {
+ // given
+ val service = mockk()
+ val slot = slot()
+ every { service.getDataFromDb(capture(slot)) } returns "Expected Output"
+ // when
+ service.getDataFromDb("Expected Param")
+ // then
+ assertEquals("Expected Param", slot.captured)
+ }
+
+ @Test
+ fun givenMock_whenCapturingParamsValues_thenProperValuesShouldBeCaptured() {
+ // given
+ val service = mockk()
+ val list = mutableListOf()
+ every { service.getDataFromDb(capture(list)) } returns "Expected Output"
+ // when
+ service.getDataFromDb("Expected Param 1")
+ service.getDataFromDb("Expected Param 2")
+ // then
+ assertEquals(2, list.size)
+ assertEquals("Expected Param 1", list[0])
+ assertEquals("Expected Param 2", list[1])
+ }
+
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
new file mode 100644
index 0000000000..e9ef133663
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
@@ -0,0 +1,33 @@
+package com.baeldung.mockk
+
+import io.mockk.*
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+
+class Foo {
+ lateinit var name: String
+ lateinit var bar: Bar
+}
+
+class Bar {
+ lateinit var nickname: String
+}
+
+class HierarchicalMockKUnitTest {
+
+ @Test
+ fun givenHierarchicalClass_whenMockingIt_thenReturnProperValue() {
+ // given
+ val foo = mockk {
+ every { name } returns "Karol"
+ every { bar } returns mockk {
+ every { nickname } returns "Tomato"
+ }
+ }
+ // when
+ val result = foo.bar.nickname
+ // then
+ assertEquals("Tomato", result)
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt
new file mode 100644
index 0000000000..d6f57e5fb0
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt
@@ -0,0 +1,12 @@
+package com.baeldung.mockk
+
+class TestableService {
+ fun getDataFromDb(testParameter: String): String {
+ // query database and return matching value
+ return "Value from DB"
+ }
+
+ fun doSomethingElse(testParameter: String): String {
+ return "I don't want to!"
+ }
+}
\ No newline at end of file