From b85957eb0cbf9a62315f98b52a34fd7a96c8c2f0 Mon Sep 17 00:00:00 2001 From: Sergio del Amo Date: Mon, 19 Sep 2022 19:32:19 +0200 Subject: [PATCH] Maven test dependencies outside of rocker (#1432) --- .../build/maven/templates/pom.rocker.raw | 28 ------- .../micronaut/starter/feature/test/Junit.java | 36 +++++++- .../starter/feature/test/KoTest.java | 32 ++++++++ .../micronaut/starter/feature/test/Mockk.java | 82 +++++++++++++++++++ .../micronaut/starter/feature/test/Spock.java | 40 ++++++++- starter-core/src/main/resources/pom.xml | 15 ++++ .../starter/feature/test/MockkSpec.groovy | 72 ++++++++++++++++ 7 files changed, 274 insertions(+), 31 deletions(-) create mode 100644 starter-core/src/main/java/io/micronaut/starter/feature/test/Mockk.java create mode 100644 starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockkSpec.groovy diff --git a/starter-core/src/main/java/io/micronaut/starter/feature/build/maven/templates/pom.rocker.raw b/starter-core/src/main/java/io/micronaut/starter/feature/build/maven/templates/pom.rocker.raw index 1930e45e371..0e23b0807a0 100644 --- a/starter-core/src/main/java/io/micronaut/starter/feature/build/maven/templates/pom.rocker.raw +++ b/starter-core/src/main/java/io/micronaut/starter/feature/build/maven/templates/pom.rocker.raw @@ -147,34 +147,6 @@ MavenBuild mavenBuild @if (!features.contains("http-client")) { @dependency.template("io.micronaut", "micronaut-http-client", "test", null, false, null) } -@if (features.testFramework().isJunit()) { -@dependency.template("org.junit.jupiter", "junit-jupiter-api", "test", null, false, null) -@dependency.template("org.junit.jupiter", "junit-jupiter-engine", "test", null, false, null) -@dependency.template("io.micronaut.test", "micronaut-test-junit5", "test", null, false, null) -} else if (features.testFramework().isKotlinTestFramework()) { -@dependency.template("io.mockk", "mockk", "test", "1.9.3", false, null) -@if (features.testFramework().isKoTest()) { -@dependency.template("io.micronaut.test", "micronaut-test-kotest", "test", null, false, null) -@dependency.template("io.kotest", "kotest-runner-junit5-jvm", "test", "4.2.5", false, null) -@dependency.template("io.kotest", "kotest-assertions-core-jvm", "test", "4.2.5", false, null) -} -} else if (features.testFramework().isSpock()) { -@if (!features.language().isGroovy()) { -@dependency.template("io.micronaut", "micronaut-inject-groovy", "test", null, false, null) -} - - org.spockframework - spock-core - test - - - org.codehaus.groovy - groovy-all - - - -@dependency.template("io.micronaut.test", "micronaut-test-spock", "test", null, false, null) -} @if (features.contains("neo4j-bolt")) { @dependency.template("org.neo4j.test", "neo4j-harness", "test", null, false, null) } diff --git a/starter-core/src/main/java/io/micronaut/starter/feature/test/Junit.java b/starter-core/src/main/java/io/micronaut/starter/feature/test/Junit.java index fadaa865ab7..6cb9d331599 100644 --- a/starter-core/src/main/java/io/micronaut/starter/feature/test/Junit.java +++ b/starter-core/src/main/java/io/micronaut/starter/feature/test/Junit.java @@ -15,27 +15,59 @@ */ package io.micronaut.starter.feature.test; +import io.micronaut.core.annotation.NonNull; import io.micronaut.starter.application.generator.GeneratorContext; +import io.micronaut.starter.build.dependencies.Dependency; +import io.micronaut.starter.build.dependencies.MicronautDependencyUtils; +import io.micronaut.starter.options.BuildTool; import io.micronaut.starter.options.TestFramework; import jakarta.inject.Singleton; @Singleton public class Junit implements TestFeature { + protected static final String GROUP_ID_JUNIT_JUPITER = "org.junit.jupiter"; + protected static final String ARTIFACT_ID_JUNIT_JUPITER_API = "junit-jupiter-api"; + protected static final String ARTIFACT_ID_JUNIT_JUPITER_ENGINE = "junit-jupiter-engine"; + + protected static final String ARTIFACT_ID_MICRONAUT_TEST_JUNIT_5 = "micronaut-test-junit5"; + + protected static final Dependency DEPENDENCY_JUNIT_JUPITER_API = Dependency.builder() + .groupId(GROUP_ID_JUNIT_JUPITER) + .artifactId(ARTIFACT_ID_JUNIT_JUPITER_API) + .test() + .build(); + + protected static final Dependency DEPENDENCY_JUNIT_JUPITER_ENGINE = Dependency.builder() + .groupId(GROUP_ID_JUNIT_JUPITER) + .artifactId(ARTIFACT_ID_JUNIT_JUPITER_ENGINE) + .test() + .build(); + + protected static final Dependency DEPENDENCY_MICRONAUT_TEST_JUNIT5 = MicronautDependencyUtils + .testDependency() + .artifactId(ARTIFACT_ID_MICRONAUT_TEST_JUNIT_5) + .test() + .build(); @Override + @NonNull public String getName() { return "junit"; } @Override public void doApply(GeneratorContext generatorContext) { - // no-op + // Only for Maven, these dependencies are applied by the Micronaut Gradle Plugin + if (generatorContext.getBuildTool() == BuildTool.MAVEN) { + generatorContext.addDependency(DEPENDENCY_JUNIT_JUPITER_API); + generatorContext.addDependency(DEPENDENCY_JUNIT_JUPITER_ENGINE); + generatorContext.addDependency(DEPENDENCY_MICRONAUT_TEST_JUNIT5); + } } @Override public TestFramework getTestFramework() { return TestFramework.JUNIT; } - } diff --git a/starter-core/src/main/java/io/micronaut/starter/feature/test/KoTest.java b/starter-core/src/main/java/io/micronaut/starter/feature/test/KoTest.java index 527935d4636..b79b8bf8e95 100644 --- a/starter-core/src/main/java/io/micronaut/starter/feature/test/KoTest.java +++ b/starter-core/src/main/java/io/micronaut/starter/feature/test/KoTest.java @@ -15,7 +15,11 @@ */ package io.micronaut.starter.feature.test; +import io.micronaut.core.annotation.NonNull; import io.micronaut.starter.application.generator.GeneratorContext; +import io.micronaut.starter.build.dependencies.Dependency; +import io.micronaut.starter.build.dependencies.MicronautDependencyUtils; +import io.micronaut.starter.options.BuildTool; import io.micronaut.starter.options.TestFramework; import io.micronaut.starter.template.URLTemplate; @@ -23,8 +27,25 @@ @Singleton public class KoTest implements TestFeature { + protected static final String ARTIFACT_ID_MICRONAUT_TEST_KOTEST = "micronaut-test-kotest"; + + protected static final Dependency DEPENDENCY_MICRONAUT_TEST_KOTEST = MicronautDependencyUtils + .testDependency() + .artifactId(ARTIFACT_ID_MICRONAUT_TEST_KOTEST) + .test() + .build(); + protected static final String ARTIFACT_ID_KOTEST_RUNNER_JUNIT_5_JVM = "kotest-runner-junit5-jvm"; + + protected static final String ARTIFACT_ID_KOTEST_ASSERTIONS_CORE_JVM = "kotest-assertions-core-jvm"; + + protected final Mockk mockk; + + public KoTest(Mockk mockk) { + this.mockk = mockk; + } @Override + @NonNull public String getName() { return "kotest"; } @@ -35,6 +56,17 @@ public void doApply(GeneratorContext generatorContext) { generatorContext.addTemplate("koTestConfig", new URLTemplate("src/test/kotlin/io/kotest/provided/ProjectConfig.kt", classLoader.getResource("kotest/ProjectConfig.kt"))); + + // Only for Maven, these dependencies are applied by the Micronaut Gradle Plugin + if (generatorContext.getBuildTool() == BuildTool.MAVEN) { + generatorContext.addDependency(DEPENDENCY_MICRONAUT_TEST_KOTEST); + generatorContext.addDependency(Dependency.builder() + .lookupArtifactId(ARTIFACT_ID_KOTEST_RUNNER_JUNIT_5_JVM) + .test()); + generatorContext.addDependency(Dependency.builder() + .lookupArtifactId(ARTIFACT_ID_KOTEST_ASSERTIONS_CORE_JVM) + .test()); + } } @Override diff --git a/starter-core/src/main/java/io/micronaut/starter/feature/test/Mockk.java b/starter-core/src/main/java/io/micronaut/starter/feature/test/Mockk.java new file mode 100644 index 00000000000..f1e999e4541 --- /dev/null +++ b/starter-core/src/main/java/io/micronaut/starter/feature/test/Mockk.java @@ -0,0 +1,82 @@ +/* + * Copyright 2017-2022 original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micronaut.starter.feature.test; + +import io.micronaut.core.annotation.NonNull; +import io.micronaut.starter.application.ApplicationType; +import io.micronaut.starter.application.generator.GeneratorContext; +import io.micronaut.starter.build.dependencies.Dependency; +import io.micronaut.starter.feature.DefaultFeature; +import io.micronaut.starter.feature.Feature; +import io.micronaut.starter.options.BuildTool; +import io.micronaut.starter.options.Language; +import io.micronaut.starter.options.Options; +import jakarta.inject.Singleton; + +import java.util.Set; + +@Singleton +public class Mockk implements MockingFeature, DefaultFeature { + public static final String ARTIFACT_ID_MOCKK = "mockk"; + public static final String NAME_MOCKK = "mockk"; + public static final String GROUP_ID_IO_MOCKK = "io.mockk"; + + @Override + @NonNull + public String getName() { + return NAME_MOCKK; + } + + @Override + public String getTitle() { + return "Mockk"; + } + + @Override + @NonNull + public String getDescription() { + return "Mocking library for Kotlin"; + } + + @Override + public String getThirdPartyDocumentation() { + return "https://mockk.io"; + } + + @Override + public void apply(GeneratorContext generatorContext) { + // Only for Maven, these dependencies are applied by the Micronaut Gradle Plugin + if (generatorContext.getBuildTool() == BuildTool.MAVEN) { + generatorContext.addDependency(Dependency.builder() + .lookupArtifactId(ARTIFACT_ID_MOCKK) + .test()); + } + } + + @Override + public boolean isVisible() { + return false; + } + + @Override + public boolean shouldApply(ApplicationType applicationType, Options options, Set selectedFeatures) { + return options.getBuildTool() == BuildTool.MAVEN && + options.getLanguage() == Language.KOTLIN && + options.getTestFramework().isKotlinTestFramework(); + } +} + + diff --git a/starter-core/src/main/java/io/micronaut/starter/feature/test/Spock.java b/starter-core/src/main/java/io/micronaut/starter/feature/test/Spock.java index b95322621f3..4283b1769e3 100644 --- a/starter-core/src/main/java/io/micronaut/starter/feature/test/Spock.java +++ b/starter-core/src/main/java/io/micronaut/starter/feature/test/Spock.java @@ -15,22 +15,60 @@ */ package io.micronaut.starter.feature.test; +import io.micronaut.core.annotation.NonNull; import io.micronaut.starter.application.generator.GeneratorContext; +import io.micronaut.starter.build.dependencies.Dependency; +import io.micronaut.starter.build.dependencies.MicronautDependencyUtils; +import io.micronaut.starter.options.BuildTool; +import io.micronaut.starter.options.Language; import io.micronaut.starter.options.TestFramework; import jakarta.inject.Singleton; @Singleton public class Spock implements TestFeature { + protected static final String GROUP_ID_SPOCKFRAMEWORK = "org.spockframework"; + protected static final String ARTIFACT_ID_SPOCK_CORE = "spock-core"; + protected static final String GROUP_ID_CODEHAUS_GROOVY = "org.codehaus.groovy"; + protected static final String ARTIFACT_ID_GROOVY_ALL = "groovy-all"; + protected static final Dependency DEPENDENCY_MICRONAUT_INJECT_GROOVY = MicronautDependencyUtils + .coreDependency() + .artifactId("micronaut-inject-groovy") + .test() + .build(); + + protected static final Dependency DEPENDENCY_MICRONAUT_TEST_SPOCK = MicronautDependencyUtils + .testDependency() + .artifactId("micronaut-test-spock") + .test() + .build(); + + protected static final Dependency DEPENDENCY_SPOCK_CORE_EXCLUDING_GROOVY_ALL = Dependency.builder() + .groupId(GROUP_ID_SPOCKFRAMEWORK) + .artifactId(ARTIFACT_ID_SPOCK_CORE) + .exclude(Dependency.builder() + .groupId(GROUP_ID_CODEHAUS_GROOVY) + .artifactId(ARTIFACT_ID_GROOVY_ALL) + .build()) + .test() + .build(); @Override + @NonNull public String getName() { return "spock"; } @Override public void doApply(GeneratorContext generatorContext) { - // no-op + // Only for Maven, these dependencies are applied by the Micronaut Gradle Plugin + if (generatorContext.getBuildTool() == BuildTool.MAVEN) { + if (generatorContext.getLanguage() != Language.GROOVY) { + generatorContext.addDependency(DEPENDENCY_MICRONAUT_INJECT_GROOVY); + } + generatorContext.addDependency(DEPENDENCY_SPOCK_CORE_EXCLUDING_GROOVY_ALL); + generatorContext.addDependency(DEPENDENCY_MICRONAUT_TEST_SPOCK); + } } @Override diff --git a/starter-core/src/main/resources/pom.xml b/starter-core/src/main/resources/pom.xml index 1a9cd1e1cda..f60e6efe9b8 100644 --- a/starter-core/src/main/resources/pom.xml +++ b/starter-core/src/main/resources/pom.xml @@ -16,6 +16,21 @@ + + io.mockk + mockk + 1.9.3 + + + io.kotest + kotest-runner-junit5-jvm + 4.2.5 + + + io.kotest + kotest-assertions-core-jvm + 4.2.5 + io.opentelemetry.instrumentation opentelemetry-instrumentation-bom-alpha diff --git a/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockkSpec.groovy b/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockkSpec.groovy new file mode 100644 index 00000000000..feae087f0b3 --- /dev/null +++ b/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockkSpec.groovy @@ -0,0 +1,72 @@ +package io.micronaut.starter.feature.test + +import io.micronaut.starter.ApplicationContextSpec +import io.micronaut.starter.BuildBuilder +import io.micronaut.starter.application.ApplicationType +import io.micronaut.starter.feature.Category +import io.micronaut.starter.feature.Feature +import io.micronaut.starter.feature.Features +import io.micronaut.starter.fixture.CommandOutputFixture +import io.micronaut.starter.options.BuildTool +import io.micronaut.starter.options.JdkVersion +import io.micronaut.starter.options.Language +import io.micronaut.starter.options.Options +import io.micronaut.starter.options.TestFramework +import io.micronaut.starter.util.VersionInfo +import spock.lang.Shared +import spock.lang.Subject +import spock.lang.Unroll + +class MockkSpec extends ApplicationContextSpec implements CommandOutputFixture { + @Shared + @Subject + Mockk mockk = beanContext.getBean(Mockk) + + void 'test readme.md with feature mockk contains links to 3rd party docs'() { + when: + Options options = new Options(Language.KOTLIN, TestFramework.JUNIT, BuildTool.MAVEN, JdkVersion.JDK_11, Collections.emptyMap()) + Map output = generate(ApplicationType.DEFAULT, options, ['mockk']) + String readme = output["README.md"] + + then: + readme + readme.contains("https://mockk.io") + } + + void "test mockk belongs to Dev Tools category"() { + expect: + Category.DEV_TOOLS == mockk.category + } + + @Unroll + void 'mockk feature should not be applied for languages other than Kotlin'(Language language) { + given: + Set features = [mockk] as Set + expect: + !mockk.shouldApply(ApplicationType.DEFAULT, new Options(language, TestFramework.KOTEST, BuildTool.MAVEN), features) + + where: + language << Language.values() - Language.KOTLIN + } + + @Unroll + void 'test mockk feature is added automatically for Maven and Kotest for language=#language'(Language language) { + when: + String template = new BuildBuilder(beanContext, BuildTool.MAVEN) + .jdkVersion(JdkVersion.JDK_11) + .language(language) + .features([]) + .testFramework(TestFramework.KOTEST) + .render() + + then: + template.contains(""" + + io.mockk + mockk +""") + + where: + language << [Language.KOTLIN] + } +} \ No newline at end of file