diff --git a/README.md b/README.md index 99607669..ba20fe1e 100644 --- a/README.md +++ b/README.md @@ -1301,7 +1301,7 @@ val builderMock = mockk { To adjust parameters globally, there are a few settings you can specify in a resource file. How to use: - 1. Create a `io/mockk/settings.properties` file in `src/main/resources`. + 1. Create a `io/mockk/settings.properties` file in `src/test/resources`. 2. Put any of the following options: ```properties relaxed=true|false @@ -1554,7 +1554,7 @@ You can configure Restricted Mocking behavior using the `mockk.properties` file. Place the file in one of the following directories: ```plaintext -src/main/resources/mockk.properties +src/test/resources/mockk.properties ``` #### 2. Configuration Options diff --git a/gradle.properties b/gradle.properties index dd3721bf..7a3a4cab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=1.14.1-SNAPSHOT +version=1.14.3-SNAPSHOT # Enable Gradle build cache https://docs.gradle.org/current/userguide/build_cache.html org.gradle.caching=true org.gradle.configureondemand=false diff --git a/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/transformation/InliningClassTransformer.kt b/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/transformation/InliningClassTransformer.kt index 9573e3c2..c4f57f5f 100644 --- a/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/transformation/InliningClassTransformer.kt +++ b/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/transformation/InliningClassTransformer.kt @@ -73,7 +73,9 @@ internal class InliningClassTransformer( try { val builder = byteBuddy - .decorate(classBeingRedefined, of(classBeingRedefined.name, classfileBuffer)) + // Work around for https://bugs.openjdk.org/browse/JDK-8136614 + .with(VisibilityBridgeStrategy { not(isDefaultMethod()).matches(it) }) + .redefine(classBeingRedefined, of(classBeingRedefined.name, classfileBuffer)) .visit(FixParameterNamesVisitor(classBeingRedefined)) val type = builder diff --git a/test-modules/client-tests/build.gradle.kts b/test-modules/client-tests/build.gradle.kts index 930d062e..7195c20a 100644 --- a/test-modules/client-tests/build.gradle.kts +++ b/test-modules/client-tests/build.gradle.kts @@ -2,6 +2,7 @@ import buildsrc.config.kotlinVersion plugins { buildsrc.convention.`kotlin-multiplatform` + jacoco } kotlin { @@ -44,7 +45,19 @@ kotlin { } } +tasks.register("jacocoTestReport") { + dependsOn(tasks.withType()) + + reports { + html.required.set(true) + xml.required.set(false) + csv.required.set(false) + } +} + tasks.withType { // Forward the expected Kotlin version to unit tests environment("kotlin.version", kotlinVersion()) + useJUnitPlatform() + finalizedBy(tasks.getByName("jacocoTestReport")) } diff --git a/test-modules/client-tests/src/jvmTest/java/io/mockk/core/ClassWithStaticField.java b/test-modules/client-tests/src/jvmTest/java/io/mockk/core/ClassWithStaticField.java new file mode 100644 index 00000000..ddda81ce --- /dev/null +++ b/test-modules/client-tests/src/jvmTest/java/io/mockk/core/ClassWithStaticField.java @@ -0,0 +1,9 @@ +package io.mockk.core; + +public class ClassWithStaticField { + private static final ClassWithStaticField INSTANCE = new ClassWithStaticField(); + public static ClassWithStaticField instance() { + return INSTANCE; + } + public int foo() { return 10; } +} diff --git a/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/impl/MockkStaticWithInitializerTest.kt b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/impl/MockkStaticWithInitializerTest.kt new file mode 100644 index 00000000..28dacb73 --- /dev/null +++ b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/impl/MockkStaticWithInitializerTest.kt @@ -0,0 +1,23 @@ +package io.mockk.impl + +import io.mockk.core.ClassWithStaticField +import io.mockk.every +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import io.mockk.verify +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class MockkStaticWithInitializerTest { + @Test + fun `should be able to mockk static a class with static fields with coverage `() { + mockkStatic(ClassWithStaticField::class) + every { ClassWithStaticField.instance().foo() } returns 12 + + assertEquals(12, ClassWithStaticField.instance().foo()) + + verify(exactly = 1) { ClassWithStaticField.instance().foo() } + unmockkStatic(ClassWithStaticField::class) + assertEquals(10, ClassWithStaticField.instance().foo()) + } +} \ No newline at end of file