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 42847544b14..5697de9284e 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
@@ -148,38 +148,12 @@ MavenBuild mavenBuild
@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)
@if (features.contains("hamcrest")) {
@dependency.template("org.hamcrest", "hamcrest", "test", null, false, null)
}
@if (features.contains("mockito")) {
@dependency.template("org.mockito", "mockito-core", "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/lang/groovy/Groovy.java b/starter-core/src/main/java/io/micronaut/starter/feature/lang/groovy/Groovy.java
index 95caf808fe9..d9ad87ccf91 100644
--- a/starter-core/src/main/java/io/micronaut/starter/feature/lang/groovy/Groovy.java
+++ b/starter-core/src/main/java/io/micronaut/starter/feature/lang/groovy/Groovy.java
@@ -36,11 +36,11 @@
@Singleton
public class Groovy implements LanguageFeature {
- protected final List applicationFeatures;
protected static final Dependency DEPENDENCY_MICRONAUT_GROOVY_RUNTIME = MicronautDependencyUtils.groovyDependency()
.artifactId("micronaut-runtime-groovy")
.compile()
.build();
+ protected final List applicationFeatures;
public Groovy(List applicationFeatures, Spock spock) {
this.applicationFeatures = applicationFeatures;
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/MockingFeature.java b/starter-core/src/main/java/io/micronaut/starter/feature/test/MockingFeature.java
new file mode 100644
index 00000000000..51b254081b6
--- /dev/null
+++ b/starter-core/src/main/java/io/micronaut/starter/feature/test/MockingFeature.java
@@ -0,0 +1,32 @@
+/*
+ * 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.starter.application.ApplicationType;
+import io.micronaut.starter.feature.Category;
+import io.micronaut.starter.feature.Feature;
+
+public interface MockingFeature extends Feature {
+ @Override
+ default boolean supports(ApplicationType applicationType) {
+ return true;
+ }
+
+ @Override
+ default String getCategory() {
+ return Category.DEV_TOOLS;
+ }
+}
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..adad27acc1c
--- /dev/null
+++ b/starter-core/src/main/java/io/micronaut/starter/feature/test/Mockk.java
@@ -0,0 +1,83 @@
+/*
+ * 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()
+ .groupId(GROUP_ID_IO_MOCKK)
+ .artifactId(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 c1d4147d65f..dd917d7a796 100644
--- a/starter-core/src/main/resources/pom.xml
+++ b/starter-core/src/main/resources/pom.xml
@@ -16,6 +16,16 @@
+
+ io.kotest
+ kotest-runner-junit5-jvm
+ 4.6.4
+
+
+ io.kotest
+ kotest-assertions-core-jvm
+ 4.6.4
+
io.opentelemetry.instrumentation
opentelemetry-instrumentation-bom-alpha
diff --git a/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockitoSpec.groovy b/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockitoSpec.groovy
index acd41085c93..7f854125f3e 100644
--- a/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockitoSpec.groovy
+++ b/starter-core/src/test/groovy/io/micronaut/starter/feature/test/MockitoSpec.groovy
@@ -18,8 +18,8 @@ class MockitoSpec extends ApplicationContextSpec implements CommandOutputFixture
void 'test readme.md with feature mockito contains links to 3rd party docs'() {
when:
- def output = generate(['mockito'])
- def readme = output["README.md"]
+ Map output = generate(['mockito'])
+ String readme = output["README.md"]
then:
readme
@@ -32,7 +32,7 @@ class MockitoSpec extends ApplicationContextSpec implements CommandOutputFixture
}
@Unroll
- void 'test gradle mockito feature for language=#language'() {
+ void 'test gradle mockito feature for language=#language'(Language language) {
when:
String template = new BuildBuilder(beanContext, BuildTool.GRADLE)
.language(language)
@@ -48,7 +48,7 @@ class MockitoSpec extends ApplicationContextSpec implements CommandOutputFixture
}
@Unroll
- void 'test gradle mockito feature fails for language=#language when test framework is not Junit'() {
+ void 'test gradle mockito feature fails for language=#language when test framework is not Junit'(Language language, TestFramework testfw) {
when:
new BuildBuilder(beanContext, BuildTool.GRADLE)
.language(language)
@@ -71,7 +71,7 @@ class MockitoSpec extends ApplicationContextSpec implements CommandOutputFixture
}
@Unroll
- void 'test maven mockito feature for language=#language'() {
+ void 'test maven mockito feature for language=#language'(Language language) {
when:
String template = new BuildBuilder(beanContext, BuildTool.MAVEN)
.language(language)
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