kosi-libs / MocKMP

A mocking processor for Kotlin Multiplatform
https://kosi-libs.org/mockmp
MIT License
183 stars 12 forks source link

org.kodein.mock:mockmp-test-helper-jvm conflicts with org.jetbrains.kotlin:kotlin-test-junit5 during jvmTest #31

Closed vdshb closed 1 year ago

vdshb commented 2 years ago

org.kodein.mock:mockmp-test-helper-jvm contains org.jetbrains.kotlin:kotlin-test-junit as a dependency.

org.jetbrains.kotlin:kotlin-test-junit5 and org.jetbrains.kotlin:kotlin-test-junit conflict with each other.

When project configured to use junit5 and we add mocKMP helper to it then we'll get compile time exception on running jvmTest:

Execution failed for task ':jvmTest'.
> Could not resolve all files for configuration ':jvmTestRuntimeClasspath'.
   > Could not resolve org.jetbrains.kotlin:kotlin-test-junit5:1.7.10.
     Required by:
         project : > org.jetbrains.kotlin:kotlin-test:1.7.10
      > Module 'org.jetbrains.kotlin:kotlin-test-junit5' has been rejected:
           Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.7.10' also provided by [org.jetbrains.kotlin:kotlin-test-junit:1.7.0(junitRuntime)]
   > Could not resolve org.jetbrains.kotlin:kotlin-test-junit:1.7.0.
     Required by:
         project : > org.kodein.mock:mockmp-test-helper:1.8.1 > org.kodein.mock:mockmp-test-helper-jvm:1.8.1
      > Module 'org.jetbrains.kotlin:kotlin-test-junit' has been rejected:
           Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.7.0' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.7.10(junit5Runtime)]

Reproducer:

build.gradle.kts:

plugins {
    kotlin("multiplatform") version "1.7.10"
    id("org.kodein.mock.mockmp") version "1.8.1"
}

group = "com.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

mockmp {
    usesHelper = true
}

kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = "1.8"
        }
        withJava()
        testRuns["test"].executionTask.configure {
            useJUnitPlatform()
        }
    }
    js(BOTH) {
        browser {
            commonWebpackConfig {
                cssSupport.enabled = true
            }
        }
    }

    sourceSets {
        val commonMain by getting
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }
        val jvmMain by getting
        val jvmTest by getting
        val jsMain by getting
        val jsTest by getting
    }
}

src/commonTest/kotlin/com/example/ExampleTest.kt:

package com.example

import kotlin.test.Test
import kotlin.test.assertEquals

class ExampleTest {

    @Test
    fun should_work() {
        assertEquals(1,1)
    }
}

Switching to Junit4 (useJUnitPlatform()' -> 'useJUnit()) or removing mocKMP helper (usesHelper = true -> usesHelper = false) make test runnable again.

SalomonBrys commented 1 year ago

Version 1.9.0 published with the fix.

stefanmatar commented 1 year ago

I am still getting this issue with 0.11.0

I defined usesHelper = false and useJUnitPlatform()

Execution failed for task ':kspTestKotlinJvm'.
> Error while evaluating property 'filteredArgumentsMap' of task ':kspTestKotlinJvm'
   > Could not resolve all files for configuration ':jvmTestCompileClasspath'.
      > Could not resolve org.jetbrains.kotlin:kotlin-test-junit:1.7.22.
        Required by:
            project :
         > Module 'org.jetbrains.kotlin:kotlin-test-junit' has been rejected:
              Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.7.22' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.7.22(junit5Api), org.jetbrains.kotlin:kotlin-test-junit5:1.7.21(junit5Api)]
      > Could not resolve org.jetbrains.kotlin:kotlin-test-junit5:1.7.22.
        Required by:
            project : > org.jetbrains.kotlin:kotlin-test:1.7.22
         > Module 'org.jetbrains.kotlin:kotlin-test-junit5' has been rejected:
              Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.7.21' also provided by [org.jetbrains.kotlin:kotlin-test-junit:1.7.22(junitApi)]
SalomonBrys commented 1 year ago

You need to use:

mockmp {
    usesHelper = true
}
kotlin {
    sourceSets {
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
                implementation("org.kodein.mock:mockmp-test-helper:0.11.0")
            }
        }
    }
}

I'll reopen this issue because I forgot to document this. Furthermore, the Gradle plugin should apply the correct Junit helper.

SalomonBrys commented 1 year ago

The 1.12.0 Gradle plugin applies the correct dependency according to your test framework. Thanks for the report !