You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by jd...@apache.org on 2025/11/25 19:30:03 UTC

(grails-core) 01/01: Initial work for TestFramework->DevelopmentReloading

This is an automated email from the ASF dual-hosted git repository.

jdaugherty pushed a commit to branch forgeReloadingChanges
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit a6eec2ac7333dcacacdb7b6b025c6064e09761ef
Author: James Daugherty <jd...@jdresources.net>
AuthorDate: Thu Nov 20 16:06:03 2025 -0500

    Initial work for TestFramework->DevelopmentReloading
---
 grails-doc/src/en/guide/commandLine.adoc           |  2 +-
 .../analytics/postgres/AnalyticsController.java    |  8 +--
 .../forge/analytics/postgres/Application.java      | 14 ++---
 .../analytics/postgres/FeatureRepository.java      |  4 +-
 .../postgres/StoreGeneratedProjectStatsSpec.groovy | 10 ++-
 .../grails/forge/api/ApplicationController.java    |  2 +-
 ...estFramework.java => DevelopmentReloading.java} | 23 ++++---
 ...meworkDTO.java => DevelopmentReloadingDTO.java} | 64 +++++++------------
 .../org/grails/forge/api/SelectOptionsDTO.java     | 28 ++++-----
 .../forge/api/analytics/GenerationListener.java    |  2 +-
 .../forge/api/create/AbstractCreateController.java |  6 +-
 .../api/create/github/GitHubCreateController.java  | 12 ++--
 .../api/create/github/GitHubCreateOperation.java   |  6 +-
 .../api/create/github/GitHubCreateService.java     |  6 +-
 .../forge/api/create/zip/ZipCreateController.java  | 22 +++----
 .../forge/api/create/zip/ZipCreateOperation.java   |  6 +-
 .../org/grails/forge/api/diff/DiffController.java  | 12 ++--
 .../org/grails/forge/api/diff/DiffOperations.java  |  8 +--
 ...java => DevelopmentReloadingSelectOptions.java} | 14 ++---
 .../forge/api/preview/PreviewController.java       | 10 +--
 .../forge/api/preview/PreviewOperations.java       |  6 +-
 .../src/main/resources/select_options.properties   |  2 +-
 .../org/grails/forge/api/CreateClient.groovy       | 12 ++--
 .../groovy/org/grails/forge/api/DiffClient.groovy  |  8 +--
 .../grails/forge/api/FeatureControllerSpec.groovy  | 22 +++----
 .../org/grails/forge/api/PreviewClient.groovy      |  4 +-
 .../forge/api/ZipCreateControllerSpec.groovy       |  4 +-
 .../java/org/grails/forge/cli/Application.java     |  4 +-
 .../java/org/grails/forge/cli/CodeGenConfig.java   | 14 ++---
 .../grails/forge/cli/command/CreateCommand.java    |  8 +--
 ...es.java => DevelopmentReloadingCandidates.java} |  8 +--
 ...ter.java => DevelopmentReloadingConverter.java} | 14 ++---
 .../org/grails/forge/cli/CommandFixture.groovy     |  5 +-
 .../java/org/grails/forge/analytics/Generated.java | 10 +--
 .../grails/forge/application/ContextFactory.java   | 10 +--
 .../generator/DefaultProjectGenerator.java         |  2 +-
 .../application/generator/GeneratorContext.java    | 15 +++--
 .../forge/build/gradle/GradleConfiguration.java    |  6 +-
 .../forge/build/gradle/GradleDependency.java       | 10 ++-
 ...st.java => HasDefaultDevelopmentReloading.java} |  6 +-
 .../grails/forge/defaults/LanguageDefaults.java    | 14 ++---
 .../java/org/grails/forge/diff/FeatureDiffer.java  |  2 +-
 .../org/grails/forge/feature/FeatureContext.java   | 32 +++++-----
 .../java/org/grails/forge/feature/Features.java    | 12 ++--
 .../build/gradle/templates/buildGradle.rocker.raw  |  1 -
 .../java/org/grails/forge/feature/cli.rocker.raw   |  6 +-
 .../forge/feature/database/TestContainers.java     | 27 +++-----
 .../org/grails/forge/feature/reloading/Jrebel.java |  6 ++
 .../forge/feature/reloading/ReloadingFeature.java  |  3 +
 .../feature/reloading/SpringBootDevTools.java      |  6 ++
 .../org/grails/forge/feature/test/AssertJ.java     | 68 ---------------------
 .../forge/feature/test/AssertJValidator.java       | 44 --------------
 .../forge/feature/test/GebWithTestcontainers.java  |  8 +--
 .../feature/test/GebWithWebDriverBinaries.java     |  6 +-
 .../org/grails/forge/feature/test/Hamcrest.java    | 68 ---------------------
 .../forge/feature/test/HamcrestValidator.java      | 44 --------------
 .../java/org/grails/forge/feature/test/Junit.java  | 70 ---------------------
 .../org/grails/forge/feature/test/Mockito.java     |  2 +-
 .../forge/feature/test/MockitoValidator.java       |  2 +-
 .../java/org/grails/forge/feature/test/Spock.java  | 17 +++---
 .../org/grails/forge/feature/test/TestFeature.java | 71 ----------------------
 .../feature/test/template/javaJunit.rocker.raw     | 49 ---------------
 .../options/AbstractJunitRockerModelProvider.java  | 38 ------------
 .../options/AbstractTestRockerModelProvider.java   | 33 ----------
 .../options/DefaultTestRockerModelProvider.java    | 10 +--
 .../forge/options/DevelopmentReloading.java}       | 27 ++++----
 .../org/grails/forge/options/FeatureFilter.java    | 12 ++--
 .../forge/options/JunitRockerModelProvider.java    | 45 --------------
 .../java/org/grails/forge/options/Language.java    |  2 +-
 .../java/org/grails/forge/options/Options.java     | 48 +++++++--------
 .../org/grails/forge/options/TestFramework.java    | 46 ++------------
 .../forge/options/TestRockerModelProvider.java     |  9 +--
 .../groovy/org/grails/forge/BuildBuilder.groovy    | 14 ++---
 .../dependencies/GradleConfigurationSpec.groovy    |  3 +-
 .../GradleDependencyComparatorSpec.groovy          |  3 +-
 .../grails/forge/build/gradle/GradleSpec.groovy    | 13 ++--
 .../feature/asciidoctor/AsciidoctorSpec.groovy     |  5 +-
 .../feature/assetPipeline/AssetPipelineSpec.groovy |  5 +-
 .../feature/database/HibernateGormSpec.groovy      |  5 +-
 .../feature/database/TestContainersSpec.groovy     | 22 ++-----
 .../workflows/PlainGithubWorkflowSpec.groovy       |  5 +-
 .../forge/feature/grails/GrailsBaseSpec.groovy     | 11 ++--
 .../feature/grails/GrailsDefaultPluginsSpec.groovy |  5 +-
 .../feature/grails/GrailsGradlePluginSpec.groovy   |  5 +-
 .../grailsProfiles/GrailsProfilesSpec.groovy       |  5 +-
 .../feature/grailsWrapper/GrailsWrapperSpec.groovy |  3 +-
 .../feature/lang/GrailsApplicationSpec.groovy      |  7 ++-
 .../forge/feature/logging/LogbackSpec.groovy       |  4 +-
 .../migration/DatabaseMigrationPluginSpec.groovy   |  5 +-
 .../forge/feature/other/ShadePluginSpec.groovy     |  3 +-
 .../forge/feature/spring/SpringBootSpec.groovy     |  5 +-
 .../spring/SpringBootVirtualThreadsSpec.groovy     |  5 +-
 .../feature/spring/SpringResourcesSpec.groovy      |  3 +-
 .../feature/test/GebWithTestcontainersSpec.groovy  |  5 +-
 .../test/GebWithWebDriverBinariesSpec.groovy       | 11 ++--
 .../org/grails/forge/feature/test/JUnitSpec.groovy | 39 ------------
 .../grails/forge/feature/view/GrailsGspSpec.groovy |  9 +--
 .../forge/feature/view/json/ViewJsonSpec.groovy    |  7 ++-
 .../forge/feature/view/json/ViewMarkupSpec.groovy  |  4 +-
 .../grails/forge/feature/web/GrailsWebSpec.groovy  |  5 +-
 .../org/grails/forge/fixture/ContextFixture.groovy |  3 +-
 .../grails/forge/options/TestFrameworkSpec.groovy  | 13 ++--
 .../options/TestRockerModelProviderSpec.groovy     | 12 +---
 .../org/grails/forge/utils/CommandSpec.groovy      |  7 ++-
 grails-test-examples/geb/grails-cli.yml            |  2 +-
 .../gsp-layout/grails-forge-cli.yml                |  2 +-
 .../gsp-sitemesh3/grails-forge-cli.yml             |  2 +-
 107 files changed, 434 insertions(+), 1080 deletions(-)

diff --git a/grails-doc/src/en/guide/commandLine.adoc b/grails-doc/src/en/guide/commandLine.adoc
index 25c20a77a6..dd958b6e3d 100644
--- a/grails-doc/src/en/guide/commandLine.adoc
+++ b/grails-doc/src/en/guide/commandLine.adoc
@@ -161,7 +161,7 @@ Here is an example of a "grails-forge-cli.yml" configuration for a default Grail
 ----
 applicationType: web
 defaultPackage: com.example
-testFramework: spock
+reloading: devtools
 sourceLanguage: groovy
 buildTool: gradle
 gormImpl: gorm-hibernate5
diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
index e34efc3f8d..bda17b6d93 100644
--- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
+++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
@@ -66,9 +66,9 @@ public class AnalyticsController {
         return featureRepository.topGorm();
     }
 
-    @Get("/top/testFrameworks")
-    List<TotalDTO> topTestFrameworks() {
-        return featureRepository.topTestFrameworks();
+    @Get("/top/reloading")
+    List<TotalDTO> topReloading() {
+        return featureRepository.topReloading();
     }
 
     /**
@@ -83,7 +83,7 @@ public class AnalyticsController {
         Application application = new Application(
                 generated.getType(),
                 generated.getGorm(),
-                generated.getTestFramework(),
+                generated.getReloading(),
                 generated.getJdkVersion(),
                 generated.getGrailsVersion()
         );
diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
index a76606ff4c..3bb94be0d0 100644
--- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
+++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
@@ -23,9 +23,9 @@ import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.data.annotation.*;
 import org.grails.forge.application.ApplicationType;
+import org.grails.forge.options.DevelopmentReloading;
 import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.JdkVersion;
-import org.grails.forge.options.TestFramework;
 
 import javax.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
@@ -48,7 +48,7 @@ public class Application {
     private Set<Feature> features = Collections.emptySet();
     private final ApplicationType type;
     private final GormImpl gorm;
-    private final TestFramework testFramework;
+    private final DevelopmentReloading reloading;
     private final JdkVersion jdkVersion;
     private final String grailsVersion;
     @DateCreated
@@ -58,12 +58,12 @@ public class Application {
     public Application(
             @NonNull ApplicationType type,
             @NonNull GormImpl gorm,
-            @NonNull TestFramework testFramework,
+            @NonNull DevelopmentReloading reloading,
             @NonNull JdkVersion jdkVersion,
             @NonNull @NotBlank String grailsVersion) {
         this.type = Objects.requireNonNull(type, "Type cannot be null");
         this.gorm = Objects.requireNonNull(gorm, "Gorm cannot be null");
-        this.testFramework = Objects.requireNonNull(testFramework, "Test framework cannot be null");
+        this.reloading = Objects.requireNonNull(reloading, "Development Reloading cannot be null");
         this.jdkVersion = Objects.requireNonNull(jdkVersion, "JDK version cannot be null");
         this.grailsVersion = Objects.requireNonNull(grailsVersion, "Grails version cannot be null");
     }
@@ -83,10 +83,10 @@ public class Application {
     }
 
     /**
-     * @return The test framework
+     * @return The development reloading
      */
-    public @NonNull TestFramework getTestFramework() {
-        return testFramework;
+    public @NonNull DevelopmentReloading getDevelopmentReloading() {
+        return reloading;
     }
 
     /**
diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java
index 14e60aa99e..94389bc1d7 100644
--- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java
+++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java
@@ -72,9 +72,9 @@ public abstract class FeatureRepository implements CrudRepository<Feature, Long>
     }
 
     @ReadOnly
-    List<TotalDTO> topTestFrameworks() {
+    List<TotalDTO> topReloading() {
         return this.jdbcOperations
-                .prepareStatement(query("test_framework", "application"),
+                .prepareStatement(query("reloading", "application"),
                         statement -> {
                             try (ResultSet resultSet = statement.executeQuery()) {
                                 return resultSetToTotals(resultSet);
diff --git a/grails-forge/grails-forge-analytics-postgres/src/test/groovy/org/grails/forge/analytics/postgres/StoreGeneratedProjectStatsSpec.groovy b/grails-forge/grails-forge-analytics-postgres/src/test/groovy/org/grails/forge/analytics/postgres/StoreGeneratedProjectStatsSpec.groovy
index 8a4f5e6a1d..681b769642 100644
--- a/grails-forge/grails-forge-analytics-postgres/src/test/groovy/org/grails/forge/analytics/postgres/StoreGeneratedProjectStatsSpec.groovy
+++ b/grails-forge/grails-forge-analytics-postgres/src/test/groovy/org/grails/forge/analytics/postgres/StoreGeneratedProjectStatsSpec.groovy
@@ -23,7 +23,6 @@ import io.micronaut.context.env.Environment
 import io.micronaut.core.annotation.NonNull
 import io.micronaut.data.model.Pageable
 import io.micronaut.data.model.query.builder.sql.Dialect
-import io.micronaut.data.runtime.config.SchemaGenerate
 import io.micronaut.http.HttpStatus
 import io.micronaut.http.annotation.Body
 import io.micronaut.http.annotation.Post
@@ -31,11 +30,10 @@ import io.micronaut.http.client.annotation.Client
 import org.grails.forge.analytics.Generated
 import org.grails.forge.analytics.SelectedFeature
 import org.grails.forge.application.ApplicationType
-import org.grails.forge.options.BuildTool
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.GormImpl
 import org.grails.forge.options.ServletImpl
-import org.grails.forge.options.TestFramework
 import org.grails.forge.util.VersionInfo
 import io.micronaut.test.extensions.spock.annotation.MicronautTest
 import io.micronaut.test.support.TestPropertyProvider
@@ -77,7 +75,7 @@ class StoreGeneratedProjectStatsSpec extends Specification implements TestProper
                 ApplicationType.WEB,
                 GormImpl.HIBERNATE,
                 ServletImpl.TOMCAT,
-                TestFramework.SPOCK,
+                DevelopmentReloading.DEVTOOLS,
                 JdkVersion.DEFAULT_OPTION
         )
         generated.setSelectedFeatures([new SelectedFeature("google-cloud-function")])
@@ -95,7 +93,7 @@ class StoreGeneratedProjectStatsSpec extends Specification implements TestProper
         application.type == generated.type
         application.gorm == generated.gorm
         application.jdkVersion == generated.jdkVersion
-        application.testFramework == generated.testFramework
+        application.reloading == generated.reloading
         application.features.find { it.name == 'google-cloud-function' }
         application.grailsVersion == VersionInfo.grailsVersion
         application.dateCreated
@@ -116,7 +114,7 @@ class StoreGeneratedProjectStatsSpec extends Specification implements TestProper
         gorm[0].name == 'HIBERNATE'
         featureRepository.topBuildTools()
         featureRepository.topJdkVersion()
-        featureRepository.topTestFrameworks()
+        featureRepository.topReloading()
     }
 
     @Client("/analytics")
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java
index 4e20aec27d..c3182db1e4 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java
@@ -231,7 +231,7 @@ public class ApplicationController implements ApplicationTypeOperations {
             return new Options(null, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, getOperatingSystem(requestInfo.getUserAgent()));
         }
 
-        return new Options(filter.getTest() != null ? filter.getTest().toTestFramework() : null,
+        return new Options(filter.getReloading() != null ? filter.getReloading().toDevelopmentReloading() : null,
                 filter.getGorm() == null ? GormImpl.DEFAULT_OPTION : filter.getGorm(),
                 filter.getServlet() == null ? ServletImpl.DEFAULT_OPTION : filter.getServlet(),
                 filter.getJavaVersion() == null ? JdkVersion.DEFAULT_OPTION : filter.getJavaVersion(),
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFramework.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java
similarity index 69%
copy from grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFramework.java
copy to grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java
index 6bfe7bd9f1..120d98631c 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFramework.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java
@@ -22,11 +22,12 @@ import io.micronaut.core.annotation.NonNull;
 
 import java.util.Locale;
 
-public enum TestFramework {
-    JUNIT,
-    SPOCK;
+public enum DevelopmentReloading {
+    DEVTOOLS,
+    JREBEL,
+    NONE;
 
-    static final TestFramework DEFAULT_OPTION = SPOCK;
+    static final DevelopmentReloading DEFAULT_OPTION = DEVTOOLS;
 
     @Override
     public String toString() {
@@ -38,14 +39,12 @@ public enum TestFramework {
         return name().toLowerCase(Locale.ENGLISH);
     }
 
-    public org.grails.forge.options.TestFramework toTestFramework() {
-        switch (this) {
-            case SPOCK:
-                return org.grails.forge.options.TestFramework.SPOCK;
-            default:
-            case JUNIT:
-                return org.grails.forge.options.TestFramework.JUNIT;
-        }
+    public org.grails.forge.options.DevelopmentReloading toDevelopmentReloading() {
+        return switch (this) {
+            case DEVTOOLS -> org.grails.forge.options.DevelopmentReloading.DEVTOOLS;
+            case JREBEL -> org.grails.forge.options.DevelopmentReloading.JREBEL;
+            default -> org.grails.forge.options.DevelopmentReloading.NONE;
+        };
     }
 
 }
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFrameworkDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java
similarity index 52%
rename from grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFrameworkDTO.java
rename to grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java
index 1871af476b..67abe4d6d2 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFrameworkDTO.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java
@@ -25,41 +25,28 @@ import io.micronaut.core.annotation.Introspected;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.naming.Described;
 import io.micronaut.core.naming.Named;
-import org.grails.forge.options.TestFramework;
-import org.grails.forge.util.NameUtils;
 import io.swagger.v3.oas.annotations.media.Schema;
-
-import java.util.List;
-import java.util.stream.Collectors;
+import org.grails.forge.options.DevelopmentReloading;
+import org.grails.forge.util.NameUtils;
 
 /**
- * DTO objects for {@link TestFramework}.
- *
- * @author graemerocher
- * @since 6.0.0
+ * DTO objects for {@link DevelopmentReloading}.
  */
-@Schema(name = "TestFrameworkInfo")
+@Schema(name = "DevelopmentReloadingInfo")
 @Introspected
-public class TestFrameworkDTO extends Linkable implements Named, Described, Selectable<TestFramework> {
-    static final String MESSAGE_PREFIX = GrailsForgeConfiguration.PREFIX + ".testFramework.";
+public class DevelopmentReloadingDTO extends Linkable implements Named, Described, Selectable<DevelopmentReloading> {
+    static final String MESSAGE_PREFIX = GrailsForgeConfiguration.PREFIX + ".developmentReloading.";
     private final String name;
     private final String description;
-    private final LanguageDTO defaultLanguage;
-    private final List<LanguageDTO> supportedLanguages;
-    private final TestFramework value;
+    private final DevelopmentReloading value;
 
     /**
-     * @param testFramework The testFramework
+     * @param developmentReloading The developmentReloading
      */
-    public TestFrameworkDTO(TestFramework testFramework) {
-        this.value = testFramework;
-        this.name = testFramework.toString();
-        this.description = testFramework.name();
-        this.defaultLanguage = new LanguageDTO(testFramework.getDefaultLanguage());
-        this.supportedLanguages = testFramework.getSupportedLanguages()
-                .stream()
-                .map(LanguageDTO::new)
-                .collect(Collectors.toList());
+    public DevelopmentReloadingDTO(DevelopmentReloading developmentReloading) {
+        this.value = developmentReloading;
+        this.name = developmentReloading.toString();
+        this.description = developmentReloading.name();
     }
 
     /**
@@ -68,54 +55,47 @@ public class TestFrameworkDTO extends Linkable implements Named, Described, Sele
      */
     @Creator
     @Internal
-    TestFrameworkDTO(TestFramework value, String name, String description, LanguageDTO defaultLanguage, List<LanguageDTO> supportedLanguages) {
+    DevelopmentReloadingDTO(DevelopmentReloading value, String name, String description) {
         this.value = value;
         this.name = name;
         this.description = description;
-        this.defaultLanguage = defaultLanguage;
-        this.supportedLanguages = supportedLanguages;
     }
 
     /**
      * i18n constructor.
-     * @param testFramework The type
+     * @param developmentReloading The type
      * @param messageSource The message source
      * @param messageContext The message context
      */
     @Internal
-    TestFrameworkDTO(TestFramework testFramework, MessageSource messageSource, MessageSource.MessageContext messageContext) {
-        this.value = testFramework;
-        this.name = testFramework.toString();
+    DevelopmentReloadingDTO(DevelopmentReloading developmentReloading, MessageSource messageSource, MessageSource.MessageContext messageContext) {
+        this.value = developmentReloading;
+        this.name = developmentReloading.toString();
         this.description = messageSource.getMessage(MESSAGE_PREFIX + name + ".description", messageContext, NameUtils.getNaturalNameOfEnum(name));
-        this.defaultLanguage = new LanguageDTO(testFramework.getDefaultLanguage());
-        this.supportedLanguages = testFramework.getSupportedLanguages()
-                .stream()
-                .map(LanguageDTO::new)
-                .collect(Collectors.toList());
     }
 
     @Override
-    @Schema(description = "A description of the testFramework")
+    @Schema(description = "A description of the developmentReloading")
     public String getDescription() {
         return description;
     }
 
     @Override
-    @Schema(description = "The name of the testFramework")
+    @Schema(description = "The name of the developmentReloading")
     @NonNull
     public String getName() {
         return name;
     }
 
     @Override
-    @Schema(description = "The value of the testFramework for select options")
+    @Schema(description = "The value of the developmentReloading for select options")
     @NonNull
-    public TestFramework getValue() {
+    public DevelopmentReloading getValue() {
         return value;
     }
 
     @Override
-    @Schema(description = "The label of the testFramework for select options")
+    @Schema(description = "The label of the developmentReloading for select options")
     public String getLabel() {
         return description;
     }
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java
index 5373aac511..f25ee04940 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java
@@ -24,7 +24,7 @@ import io.micronaut.core.annotation.Introspected;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.grails.forge.api.options.*;
 import org.grails.forge.application.ApplicationType;
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 import org.grails.forge.options.*;
 
 import java.util.Arrays;
@@ -45,8 +45,8 @@ public class SelectOptionsDTO {
     private JdkVersionSelectOptions jdkVersion;
 
     private LanguageSelectOptions lang;
-
-    private TestFrameworkSelectOptions test;
+    
+    private DevelopmentReloadingSelectOptions reloading;
 
     private GormImplSelectOptions gorm;
 
@@ -59,13 +59,13 @@ public class SelectOptionsDTO {
     public SelectOptionsDTO(ApplicationTypeSelectOptions type,
                             JdkVersionSelectOptions jdkVersion,
                             LanguageSelectOptions lang,
-                            TestFrameworkSelectOptions test,
+                            DevelopmentReloadingSelectOptions reloading,
                             GormImplSelectOptions gorm,
                             ServletImplSelectOptions servlet) {
         this.type = type;
         this.jdkVersion = jdkVersion;
         this.lang = lang;
-        this.test = test;
+        this.reloading = reloading;
         this.gorm = gorm;
         this.servlet = servlet;
     }
@@ -85,9 +85,9 @@ public class SelectOptionsDTO {
         return lang;
     }
 
-    @Schema(description = "supported options for test frameworks")
-    public TestFrameworkSelectOptions getTest() {
-        return test;
+    @Schema(description = "supported options for development reloading")
+    public DevelopmentReloadingSelectOptions getReloading() {
+        return reloading;
     }
 
     @Schema(description = "supported options for GORM Implementation")
@@ -136,13 +136,13 @@ public class SelectOptionsDTO {
                 new LanguageDTO(Language.DEFAULT_OPTION, messageSource, messageContext)
         );
 
-        List<TestFrameworkDTO> testFrameworks = Arrays.stream(TestFramework.values())
-                .map(it -> new TestFrameworkDTO(it, messageSource, messageContext))
+        List<DevelopmentReloadingDTO> developmentReloading = Arrays.stream(DevelopmentReloading.values())
+                .map(it -> new DevelopmentReloadingDTO(it, messageSource, messageContext))
                 .collect(Collectors.toList());
 
-        TestFrameworkSelectOptions testFrameworkOpts = new TestFrameworkSelectOptions(
-                testFrameworks,
-                new TestFrameworkDTO(TestFramework.DEFAULT_OPTION, messageSource, messageContext)
+        DevelopmentReloadingSelectOptions developmentReloadingOpts = new DevelopmentReloadingSelectOptions(
+            developmentReloading,
+                new DevelopmentReloadingDTO(DevelopmentReloading.DEFAULT_OPTION, messageSource, messageContext)
         );
 
         List<GormImplDTO> gormImpls = Arrays.stream(GormImpl.values())
@@ -164,7 +164,7 @@ public class SelectOptionsDTO {
         );
 
 
-        return new SelectOptionsDTO(applicationOpts, jdkVersionOpts, languageOpts, testFrameworkOpts, gormImplOpts, servletImplOpts);
+        return new SelectOptionsDTO(applicationOpts, jdkVersionOpts, languageOpts, developmentReloadingOpts, gormImplOpts, servletImplOpts);
 
     }
 }
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java
index 0ccb525baf..5a31e7f966 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java
@@ -50,7 +50,7 @@ public class GenerationListener {
                 context.getApplicationType(),
                 context.getGorm(),
                 context.getServlet(),
-                context.getTestFramework(),
+                context.getDevelopmentReloading(),
                 context.getJdkVersion()
         );
         generated.setSelectedFeatures(features);
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
index d91c31b33a..a9cff83391 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
@@ -24,7 +24,7 @@ import io.micronaut.http.HttpHeaders;
 import io.micronaut.http.HttpStatus;
 import io.micronaut.http.annotation.Header;
 import io.micronaut.http.exceptions.HttpStatusException;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.api.UserAgentParser;
 import org.grails.forge.api.event.ApplicationGeneratingEvent;
 import org.grails.forge.application.ApplicationType;
@@ -70,7 +70,7 @@ public abstract class AbstractCreateController {
             @Pattern(regexp = "[\\w\\d-_\\.]+") String name,
             @Nullable List<String> features,
             @Nullable BuildTool buildTool,
-            @Nullable TestFramework testFramework,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -89,7 +89,7 @@ public abstract class AbstractCreateController {
             generatorContext = projectGenerator.createGeneratorContext(
                     type,
                     project,
-                    new Options(testFramework != null ? testFramework.toTestFramework() : org.grails.forge.options.TestFramework.DEFAULT_OPTION,
+                    new Options(reloading != null ? reloading.toDevelopmentReloading() : org.grails.forge.options.DevelopmentReloading.DEFAULT_OPTION,
                             gormImpl == null ? GormImpl.DEFAULT_OPTION : gormImpl,
                             servletImpl == null ? ServletImpl.DEFAULT_OPTION : servletImpl,
                             javaVersion == null ? JdkVersion.DEFAULT_OPTION : javaVersion,
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
index 2fa9bcae1b..0915467212 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
@@ -36,7 +36,7 @@ import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
 import org.grails.forge.api.RequestInfo;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.client.github.v3.GitHubRepository;
 import org.grails.forge.options.BuildTool;
@@ -78,14 +78,14 @@ public class GitHubCreateController implements GitHubCreateOperation {
      * @param name     The name of the application The name of the application
      * @param features The features The chosen features
      * @param build    The build type (optional, defaults to Gradle)
-     * @param test     The test framework (optional, defaults to JUnit)
+     * @param reloading     The reloading framework (optional, defaults to JUnit)
      * @param gorm     The GORM (optional, defaults to Hibernate)
      * @param servlet  The Servlet (optional, defaults to Embedded Tomcat)
      * @param state    An unguessable random string. It is used to protect against cross-site request forgery attacks.
      * @return A json containing the generated application details.
      */
     @Override
-    @Get(uri = "/github/{type}/{name}{?features,gorm,servlet,build,test,javaVersion,code,state}", produces = MediaType.APPLICATION_JSON)
+    @Get(uri = "/github/{type}/{name}{?features,gorm,servlet,build,reloading,javaVersion,code,state}", produces = MediaType.APPLICATION_JSON)
     @ApiResponses(value = {
             @ApiResponse(
                     responseCode = "200",
@@ -109,7 +109,7 @@ public class GitHubCreateController implements GitHubCreateOperation {
             @Pattern(regexp = "[\\w\\d-_\\.]+") String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -123,7 +123,7 @@ public class GitHubCreateController implements GitHubCreateOperation {
                 return HttpResponse.temporaryRedirect(redirectService.constructOAuthRedirectUrl(requestInfo));
             } else {
                 GitHubRepository repository = gitHubCreateService.creatApp(
-                        type, name, features, build, test, gorm, servlet, javaVersion, code, state, userAgent);
+                        type, name, features, build, reloading, gorm, servlet, javaVersion, code, state, userAgent);
 
                 if (launcherURI == null) {
                     return HttpResponse.ok(new GitHubCreateDTO(repository.getUrl(), repository.getCloneUrl(), repository.getHtmlUrl()));
@@ -150,7 +150,7 @@ public class GitHubCreateController implements GitHubCreateOperation {
      * @param error            error code
      * @param errorDescription description
      * @return Http redirects
-     * @see <a href="https://docs.github.com/en/free-pro-team@latest/developers/apps/troubleshooting-oauth-app-access-token-request-errors">Troubleshooting OAuth App access token request errors</a>
+     * @see <a href="https://docs.github.com/en/free-pro-team@lareloading/developers/apps/troubleshooting-oauth-app-access-token-request-errors">Troubleshooting OAuth App access token request errors</a>
      */
     @Get(uri = "/github{?error,error_description}", produces = MediaType.APPLICATION_JSON)
     @ApiResponses(value = {
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
index 845439c272..16e07d8353 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
@@ -24,7 +24,7 @@ import io.micronaut.http.HttpHeaders;
 import io.micronaut.http.HttpResponse;
 import io.micronaut.http.annotation.Header;
 import org.grails.forge.api.RequestInfo;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.options.GormImpl;
@@ -49,7 +49,7 @@ public interface GitHubCreateOperation {
      * @param name        The name of the application and GitHub repository
      * @param features    The features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading option
      * @param gorm        The GORM
      * @param servlet     The Servlet
      * @param javaVersion The java version
@@ -64,7 +64,7 @@ public interface GitHubCreateOperation {
             @Pattern(regexp = "[\\w\\d-_\\.]+") String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
index a013fae7f0..d64f394628 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
@@ -25,7 +25,7 @@ import io.micronaut.core.annotation.Nullable;
 import io.micronaut.http.client.exceptions.HttpClientResponseException;
 import jakarta.inject.Singleton;
 import org.grails.forge.api.GrailsForgeConfiguration;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.api.create.AbstractCreateController;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
@@ -92,7 +92,7 @@ public class GitHubCreateService extends AbstractCreateController {
             @NonNull String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -105,7 +105,7 @@ public class GitHubCreateService extends AbstractCreateController {
         GitHubUser gitHubUser = getGitHubUser(authToken);
 
         GeneratorContext generatorContext = createProjectGeneratorContext(
-                type, name, features, build, test, gorm, servlet, javaVersion, userAgent);
+                type, name, features, build, reloading, gorm, servlet, javaVersion, userAgent);
 
         String repoName = generatorContext.getProject().getName();
         String repoDescription = String.format("Grails %s Application", generatorContext.getProject().getNaturalName());
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
index 74849ffea4..af775229a3 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
@@ -33,7 +33,7 @@ import io.micronaut.scheduling.TaskExecutors;
 import io.micronaut.scheduling.annotation.ExecuteOn;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.api.create.AbstractCreateController;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.Project;
@@ -86,14 +86,14 @@ public class ZipCreateController extends AbstractCreateController implements Zip
      * @param name        The name of the application The name of the application
      * @param features    The features The chosen features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading option
      * @param gorm        The GORM
      * @param servlet     The Servlet
      * @param javaVersion The java version
      * @return A ZIP file containing the generated application.
      */
     @Override
-    @Get(uri = "/create/{type}/{name}{?features,gorm,build,test,javaVersion}", produces = MEDIA_TYPE_APPLICATION_ZIP)
+    @Get(uri = "/create/{type}/{name}{?features,gorm,build,reloading,javaVersion}", produces = MEDIA_TYPE_APPLICATION_ZIP)
     @ApiResponse(
             description = "A ZIP file containing the generated application.",
             content = @Content(
@@ -105,12 +105,12 @@ public class ZipCreateController extends AbstractCreateController implements Zip
             @Pattern(regexp = "[\\w\\d-_\\.]+") String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
             @Nullable @Header(HttpHeaders.USER_AGENT) String userAgent) {
-        return generateAppIntoZipFile(type, name, features, build, test, gorm, servlet, javaVersion, userAgent);
+        return generateAppIntoZipFile(type, name, features, build, reloading, gorm, servlet, javaVersion, userAgent);
     }
 
     /**
@@ -120,14 +120,14 @@ public class ZipCreateController extends AbstractCreateController implements Zip
      * @param name        The ZIP name
      * @param features    The features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading option
      * @param gorm        The GORM
      * @param servlet     The Servlet
      * @param javaVersion The java version
      * @param userAgent   The browser user-agent
      * @return A Zip file containing the application
      */
-    @Get(uri = "/{name}.zip{?type,features,gorm,servlet,build,test}", produces = MEDIA_TYPE_APPLICATION_ZIP)
+    @Get(uri = "/{name}.zip{?type,features,gorm,servlet,build,reloading}", produces = MEDIA_TYPE_APPLICATION_ZIP)
     @ApiResponse(
             description = "A ZIP file containing the generated application.",
             content = @Content(
@@ -139,12 +139,12 @@ public class ZipCreateController extends AbstractCreateController implements Zip
             @Pattern(regexp = "[\\w\\d-_]+") @NotBlank String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
             @Nullable @Header("User-Agent") String userAgent) {
-        return generateAppIntoZipFile(type, name, features, build, test, gorm, servlet, javaVersion, userAgent);
+        return generateAppIntoZipFile(type, name, features, build, reloading, gorm, servlet, javaVersion, userAgent);
     }
 
     public HttpResponse<Writable> generateAppIntoZipFile(
@@ -152,13 +152,13 @@ public class ZipCreateController extends AbstractCreateController implements Zip
             @NotNull String name,
             @Nullable List<String> features,
             @Nullable BuildTool buildTool,
-            @Nullable TestFramework testFramework,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
             @Nullable String userAgent) {
 
-        GeneratorContext generatorContext = createProjectGeneratorContext(type, name, features, buildTool, testFramework, gorm, servlet, javaVersion, userAgent);
+        GeneratorContext generatorContext = createProjectGeneratorContext(type, name, features, buildTool, reloading, gorm, servlet, javaVersion, userAgent);
         MutableHttpResponse<Writable> response = HttpResponse.created(new Writable() {
             @Override
             public void writeTo(OutputStream outputStream, @Nullable Charset charset) throws IOException {
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
index 43dcf1131f..d42fae2e82 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
@@ -23,7 +23,7 @@ import io.micronaut.core.io.Writable;
 import io.micronaut.http.HttpHeaders;
 import io.micronaut.http.HttpResponse;
 import io.micronaut.http.annotation.Header;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.options.GormImpl;
@@ -48,7 +48,7 @@ public interface ZipCreateOperation {
      * @param name        The name of the application
      * @param features    The features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading
      * @param gorm        The GORM
      * @param servlet     The Servlet
      * @param javaVersion The java version
@@ -60,7 +60,7 @@ public interface ZipCreateOperation {
             @Pattern(regexp = "[\\w\\d-_\\.]+") String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
index 62f9c9c9e4..a470a55c2b 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
@@ -80,7 +80,7 @@ public class DiffController implements DiffOperations {
      * @param type        The application type
      * @param feature     The feature
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading
      * @param gorm        The GORM implementation
      * @param servlet     The Servlet implementation
      * @param javaVersion The java version
@@ -98,7 +98,7 @@ public class DiffController implements DiffOperations {
             @Nullable String name,
             @NonNull @NotBlank String feature,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -109,7 +109,7 @@ public class DiffController implements DiffOperations {
         try {
             Project project = name != null ? NameUtils.parse(name) : this.project;
             Options options = new Options(
-                    test != null ? test : TestFramework.DEFAULT_OPTION,
+                    reloading != null ? reloading : DevelopmentReloading.DEFAULT_OPTION,
                     gorm != null ? gorm : GormImpl.DEFAULT_OPTION,
                     servlet != null ? servlet : ServletImpl.DEFAULT_OPTION,
                     javaVersion != null ? javaVersion : JdkVersion.DEFAULT_OPTION
@@ -137,7 +137,7 @@ public class DiffController implements DiffOperations {
      * @param name        The name of the application
      * @param features    The features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading
      * @param servlet     The Servlet implementation
      * @param requestInfo The request info
      * @return An HTTP response that emits a writable
@@ -152,7 +152,7 @@ public class DiffController implements DiffOperations {
             @Pattern(regexp = "[\\w\\d-_\\.]+") String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -162,7 +162,7 @@ public class DiffController implements DiffOperations {
         try {
             Project project = name != null ? NameUtils.parse(name) : this.project;
             Options options = new Options(
-                    test != null ? test : TestFramework.DEFAULT_OPTION,
+                    reloading != null ? reloading : DevelopmentReloading.DEFAULT_OPTION,
                     gorm != null ? gorm : GormImpl.DEFAULT_OPTION,
                     servlet != null ? servlet : ServletImpl.DEFAULT_OPTION,
                     javaVersion != null ? javaVersion : JdkVersion.DEFAULT_OPTION
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
index 6249b23f45..609deb0b92 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
@@ -45,7 +45,7 @@ public interface DiffOperations {
      * @param name        The project name
      * @param feature     The feature
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading
      * @param gorm        The GORM implementation
      * @param servlet     The Servlet implementation
      * @param javaVersion The java version
@@ -58,7 +58,7 @@ public interface DiffOperations {
             @Nullable String name,
             @NotBlank @NonNull String feature,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -71,7 +71,7 @@ public interface DiffOperations {
      * @param name        The name of the application
      * @param features    The features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading        The reloading framework
      * @param gorm        The GORM implementation
      * @param servlet     The Servlet implementation
      * @param javaVersion The java version
@@ -84,7 +84,7 @@ public interface DiffOperations {
             @Nullable String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/TestFrameworkSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java
similarity index 72%
rename from grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/TestFrameworkSelectOptions.java
rename to grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java
index 5960185d46..cdaf421ad6 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/TestFrameworkSelectOptions.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java
@@ -18,25 +18,25 @@
  */
 package org.grails.forge.api.options;
 
-import org.grails.forge.api.SelectOptionDTO;
-import org.grails.forge.api.TestFrameworkDTO;
 import io.swagger.v3.oas.annotations.media.Schema;
+import org.grails.forge.api.SelectOptionDTO;
+import org.grails.forge.api.DevelopmentReloadingDTO;
 
 import java.util.List;
 
-@Schema(name = "TestFrameworkSelectOptions")
-public class TestFrameworkSelectOptions extends SelectOptionDTO<TestFrameworkDTO> {
-    public TestFrameworkSelectOptions(List<TestFrameworkDTO> options, TestFrameworkDTO defaultOption) {
+@Schema(name = "DevelopmentReloadingSelectOptions")
+public class DevelopmentReloadingSelectOptions extends SelectOptionDTO<DevelopmentReloadingDTO> {
+    public DevelopmentReloadingSelectOptions(List<DevelopmentReloadingDTO> options, DevelopmentReloadingDTO defaultOption) {
         super(options, defaultOption);
     }
 
     @Override
-    public List<TestFrameworkDTO> getOptions() {
+    public List<DevelopmentReloadingDTO> getOptions() {
         return super.getOptions();
     }
 
     @Override
-    public TestFrameworkDTO getDefaultOption() {
+    public DevelopmentReloadingDTO getDefaultOption() {
         return super.getDefaultOption();
     }
 }
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java
index ae20e133ec..1cb72a9b16 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java
@@ -27,7 +27,7 @@ import io.micronaut.http.annotation.Get;
 import io.micronaut.http.exceptions.HttpStatusException;
 import org.grails.forge.api.Relationship;
 import org.grails.forge.api.RequestInfo;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.api.create.AbstractCreateController;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.Project;
@@ -72,19 +72,19 @@ public class PreviewController extends AbstractCreateController implements Previ
      * @param name The name of the application The name of the application
      * @param features The features The chosen features
      * @param build The build type (optional, defaults to Gradle)
-     * @param test The test framework (optional, defaults to JUnit)
+     * @param reloading the development reloading (jrebel, dev tools, none, etc)
      * @param gorm The GORM (optional, defaults to Hibernate)
      * @param servlet The Servlet (optional, defaults to Embedded Tomcat)
      * @return A preview of the application contents.
      */
-    @Get(uri = "/{type}/{name}{?features,gorm,servlet,build,test,javaVersion}", produces = MediaType.APPLICATION_JSON)
+    @Get(uri = "/{type}/{name}{?features,gorm,servlet,build,reloading,javaVersion}", produces = MediaType.APPLICATION_JSON)
     @Override
     public PreviewDTO previewApp(
             ApplicationType type,
             String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
@@ -95,7 +95,7 @@ public class PreviewController extends AbstractCreateController implements Previ
             projectGenerator.generate(type,
                     project,
                     new Options(
-                            test != null ? test.toTestFramework() : null,
+                            reloading != null ? reloading.toDevelopmentReloading() : null,
                             gorm == null ? GormImpl.DEFAULT_OPTION : gorm,
                             servlet == null ? ServletImpl.DEFAULT_OPTION : servlet,
                             javaVersion == null ? JdkVersion.DEFAULT_OPTION : javaVersion,
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java
index 8b49fe6a1d..e16700b32d 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java
+++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java
@@ -22,7 +22,7 @@ import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.swagger.v3.oas.annotations.Parameter;
 import org.grails.forge.api.RequestInfo;
-import org.grails.forge.api.TestFramework;
+import org.grails.forge.api.DevelopmentReloading;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.options.GormImpl;
@@ -40,7 +40,7 @@ public interface PreviewOperations {
      * @param name        The name of the application
      * @param features    The features
      * @param build       The build tool
-     * @param test        The test framework
+     * @param reloading   The development reloading
      * @param gorm        The GORM
      * @param servlet     The Servlet
      * @param javaVersion The java version
@@ -53,7 +53,7 @@ public interface PreviewOperations {
             String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable GormImpl gorm,
             @Nullable ServletImpl servlet,
             @Nullable JdkVersion javaVersion,
diff --git a/grails-forge/grails-forge-api/src/main/resources/select_options.properties b/grails-forge/grails-forge-api/src/main/resources/select_options.properties
index 1ca9b9835c..ef0ccf9e8b 100644
--- a/grails-forge/grails-forge-api/src/main/resources/select_options.properties
+++ b/grails-forge/grails-forge-api/src/main/resources/select_options.properties
@@ -1 +1 @@
-grails.forge.testFramework.junit.description=JUnit
+grails.forge.developmentReloading.devtools.description=Dev Tools
diff --git a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/CreateClient.groovy b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/CreateClient.groovy
index 87a0702eb8..1e57b86aee 100644
--- a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/CreateClient.groovy
+++ b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/CreateClient.groovy
@@ -28,30 +28,30 @@ import org.grails.forge.options.Language
 
 @Client('/')
 interface CreateClient {
-    @Get(uri = "/create/web/{name}{?features,build,test,lang}", consumes = "application/zip")
+    @Get(uri = "/create/web/{name}{?features,build,reloading,lang}", consumes = "application/zip")
     byte[] createApp(
             String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable Language lang
     );
 
-    @Get(uri = "/create/web/{name}{?features,build,test,lang}", consumes = "application/zip")
+    @Get(uri = "/create/web/{name}{?features,build,reloading,lang}", consumes = "application/zip")
     HttpResponse<byte[]> createResponse(
             String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable Language lang
     );
 
-    @Get(uri = "/{name}.zip{?features,build,test,lang}", consumes = "application/zip")
+    @Get(uri = "/{name}.zip{?features,build,reloading,lang}", consumes = "application/zip")
     HttpResponse<byte[]> getZip(
             String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable Language lang
     );
 }
diff --git a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
index 278c6259b5..5978ff297a 100644
--- a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
+++ b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
@@ -34,23 +34,23 @@ import javax.validation.constraints.NotNull
 
 @Client('/diff')
 interface DiffClient {
-    @Get(uri = "/{type}/feature/{feature}{?lang,build,test,javaVersion,name}",
+    @Get(uri = "/{type}/feature/{feature}{?lang,build,reloading,javaVersion,name}",
             consumes = MediaType.TEXT_PLAIN)
     String diffFeature(
             @NotNull ApplicationType type,
             @Nullable String name,
             @NotBlank @NonNull String feature,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable Language lang,
             @Nullable JdkVersion javaVersion);
 
-    @Get(uri = "/{type}/{name}{?features,lang,build,test,javaVersion}", consumes = MediaType.TEXT_PLAIN)
+    @Get(uri = "/{type}/{name}{?features,lang,build,reloading,javaVersion}", consumes = MediaType.TEXT_PLAIN)
     String diffApp(ApplicationType type,
                    String name,
                    @Nullable List<String> features,
                    @Nullable BuildTool build,
-                   @Nullable TestFramework test,
+                   @Nullable DevelopmentReloading reloading,
                    @Nullable Language lang,
                    @Nullable JdkVersion javaVersion);
 }
diff --git a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/FeatureControllerSpec.groovy b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/FeatureControllerSpec.groovy
index f0e924a15f..9c1f371538 100644
--- a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/FeatureControllerSpec.groovy
+++ b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/FeatureControllerSpec.groovy
@@ -19,19 +19,17 @@
 
 package org.grails.forge.api
 
-import com.fasterxml.jackson.core.JsonParser
 import com.fasterxml.jackson.databind.ObjectMapper
 import io.micronaut.http.HttpRequest
 import io.micronaut.http.client.HttpClient
 import io.micronaut.http.client.annotation.Client
-import io.micronaut.json.tree.JsonNode
 import io.micronaut.test.extensions.spock.annotation.MicronautTest
 import jakarta.inject.Inject
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.options.FeatureFilter
 import org.grails.forge.options.GormImpl
 import org.grails.forge.options.JdkVersion
-import org.grails.forge.options.TestFramework
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.ServletImpl
 import spock.lang.Specification
 
@@ -50,7 +48,7 @@ class FeatureControllerSpec extends Specification {
         List<FeatureDTO> features = applicationTypeClient
                 .features(ApplicationType.DEFAULT_OPTION,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                         gorm: GormImpl.DEFAULT_OPTION,
                         servlet: ServletImpl.DEFAULT_OPTION,
                         javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -64,7 +62,7 @@ class FeatureControllerSpec extends Specification {
         List<FeatureDTO> communityFeatures = applicationTypeClient
                 .features(ApplicationType.DEFAULT_OPTION,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -78,7 +76,7 @@ class FeatureControllerSpec extends Specification {
         when:
         List<FeatureDTO> features = applicationTypeClient
                 .spanishFeatures(ApplicationType.DEFAULT_OPTION,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -94,7 +92,7 @@ class FeatureControllerSpec extends Specification {
         when:
         List<FeatureDTO> features = applicationTypeClient
                 .spanishDefaultFeatures(ApplicationType.DEFAULT_OPTION,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -111,7 +109,7 @@ class FeatureControllerSpec extends Specification {
         def features = applicationTypeClient
                 .defaultFeatures(ApplicationType.PLUGIN,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -124,7 +122,7 @@ class FeatureControllerSpec extends Specification {
         features = applicationTypeClient
                 .defaultFeatures(ApplicationType.DEFAULT_OPTION,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -138,7 +136,7 @@ class FeatureControllerSpec extends Specification {
         def features = applicationTypeClient
                 .features(ApplicationType.PLUGIN,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -150,7 +148,7 @@ class FeatureControllerSpec extends Specification {
         features = applicationTypeClient
                 .features(ApplicationType.DEFAULT_OPTION,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
@@ -164,7 +162,7 @@ class FeatureControllerSpec extends Specification {
         def features = applicationTypeClient
                 .features(ApplicationType.WEB,
                         RequestInfo.LOCAL,
-                        new FeatureFilter(test: TestFramework.DEFAULT_OPTION,
+                        new FeatureFilter(reloading: DevelopmentReloading.DEFAULT_OPTION,
                                 gorm: GormImpl.DEFAULT_OPTION,
                                 servlet: ServletImpl.DEFAULT_OPTION,
                                 javaVersion: JdkVersion.DEFAULT_OPTION)).features
diff --git a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/PreviewClient.groovy b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/PreviewClient.groovy
index 34b0146cb6..a254b95692 100644
--- a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/PreviewClient.groovy
+++ b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/PreviewClient.groovy
@@ -30,13 +30,13 @@ import org.grails.forge.options.Language
 
 @Client('/preview')
 interface PreviewClient  {
-    @Get(uri = "/web/{name}{?features,build,test,lang}", consumes = MediaType.APPLICATION_JSON)
+    @Get(uri = "/web/{name}{?features,build,reloading,lang}", consumes = MediaType.APPLICATION_JSON)
     PreviewDTO previewApp(
             ApplicationType type,
             String name,
             @Nullable List<String> features,
             @Nullable BuildTool build,
-            @Nullable TestFramework test,
+            @Nullable DevelopmentReloading reloading,
             @Nullable Language lang
     );
 }
diff --git a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/ZipCreateControllerSpec.groovy b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/ZipCreateControllerSpec.groovy
index 5c8486b89b..598e781ee5 100644
--- a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/ZipCreateControllerSpec.groovy
+++ b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/ZipCreateControllerSpec.groovy
@@ -106,9 +106,9 @@ class ZipCreateControllerSpec extends Specification {
 
     void "test create app with spock"() {
         when:
-        def bytes = client.createApp("test", ['gorm-mongodb'], BuildTool.GRADLE, TestFramework.SPOCK, Language.GROOVY)
+        def bytes = client.createApp("test", ['gorm-mongodb'], BuildTool.GRADLE, DevelopmentReloading.DEVTOOLS, Language.GROOVY)
 
         then:
-        ZipUtil.containsFileWithContents(bytes, "test/build.gradle", "spock")
+        ZipUtil.containsFileWithContents(bytes, "test/build.gradle", "spring-boot-devtools")
     }
 }
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java
index f0c23b9a02..43732af4e3 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java
@@ -61,8 +61,8 @@ import java.util.function.BiFunction;
         ServletImplCandidates.class,
         ServletImplConverter.class,
         CommonOptionsMixin.class,
-        TestFrameworkCandidates.class,
-        TestFrameworkConverter.class
+        DevelopmentReloadingCandidates.class,
+        DevelopmentReloadingConverter.class
 })
 public class Application extends BaseCommand implements Callable<Integer> {
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java
index 8ec644449c..80935429e4 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java
@@ -31,7 +31,7 @@ import org.grails.forge.io.FileSystemOutputHandler;
 import org.grails.forge.options.JdkVersion;
 import org.grails.forge.options.Language;
 import org.grails.forge.options.Options;
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 import org.yaml.snakeyaml.Yaml;
 
 import java.io.File;
@@ -46,7 +46,7 @@ public class CodeGenConfig {
 
     private ApplicationType applicationType;
     private String defaultPackage;
-    private TestFramework testFramework;
+    private DevelopmentReloading reloading;
     private Language sourceLanguage;
     private List<String> features;
 
@@ -68,12 +68,12 @@ public class CodeGenConfig {
         this.defaultPackage = defaultPackage;
     }
 
-    public TestFramework getTestFramework() {
-        return testFramework;
+    public DevelopmentReloading getReloading() {
+        return reloading;
     }
 
-    public void setTestFramework(TestFramework testFramework) {
-        this.testFramework = testFramework;
+    public void setReloading(DevelopmentReloading reloading) {
+        this.reloading = reloading;
     }
 
     public Language getSourceLanguage() {
@@ -158,7 +158,7 @@ public class CodeGenConfig {
                             .map(DefaultFeature.class::cast)
                             .filter(f -> f.shouldApply(
                                     codeGenConfig.getApplicationType(),
-                                    new Options(codeGenConfig.getTestFramework(), JdkVersion.DEFAULT_OPTION),
+                                    new Options(codeGenConfig.getReloading(), JdkVersion.DEFAULT_OPTION),
                                     new HashSet<>()))
                             .map(Feature::getName)
                             .collect(Collectors.toList()));
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
index 5baf21df43..aa478ae674 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
@@ -46,8 +46,8 @@ public abstract class CreateCommand extends BaseCommand implements Callable<Inte
     String name;
 
     @ReflectiveAccess
-    @CommandLine.Option(names = {"-t", "--test"}, paramLabel = "TEST", description = "Which test framework to use. Possible values: ${COMPLETION-CANDIDATES}.", completionCandidates = TestFrameworkCandidates.class, converter = TestFrameworkConverter.class)
-    TestFramework test;
+    @CommandLine.Option(names = {"-r", "--reloading"}, paramLabel = "RELOADING", description = "Which development reloading option to use. Possible values: ${COMPLETION-CANDIDATES}.", completionCandidates = DevelopmentReloadingCandidates.class, converter = DevelopmentReloadingConverter.class)
+    DevelopmentReloading reloading;
 
     @ReflectiveAccess
     @CommandLine.Option(names = {"-g", "--gorm"}, paramLabel = "GORM Implementation", description = "Which GORM Implementation to configure. Possible values: ${COMPLETION-CANDIDATES}.", completionCandidates = GormImplCandidates.class, converter = GormImplConverter.class)
@@ -96,7 +96,7 @@ public abstract class CreateCommand extends BaseCommand implements Callable<Inte
     public Integer call() throws Exception {
         if (listFeatures) {
             new ListFeatures(availableFeatures,
-                    new Options(test, gormImpl, servletImpl, getJdkVersion(), getOperatingSystem()),
+                    new Options(reloading, gormImpl, servletImpl, getJdkVersion(), getOperatingSystem()),
                     applicationType,
                     getOperatingSystem(),
                     contextFactory).output(this);
@@ -122,7 +122,7 @@ public abstract class CreateCommand extends BaseCommand implements Callable<Inte
     }
 
     public void generate(Project project, OutputHandler outputHandler) throws Exception {
-        Options options = new Options(test, gormImpl, servletImpl, getJdkVersion(), getOperatingSystem(), getAdditionalOptions());
+        Options options = new Options(reloading, gormImpl, servletImpl, getJdkVersion(), getOperatingSystem(), getAdditionalOptions());
 
         projectGenerator.generate(applicationType, project, options, getOperatingSystem(), getSelectedFeatures(), outputHandler, this);
     }
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/TestFrameworkCandidates.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java
similarity index 75%
rename from grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/TestFrameworkCandidates.java
rename to grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java
index dd3148a069..49e80e4c65 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/TestFrameworkCandidates.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java
@@ -18,15 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 
 import java.util.ArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-public class TestFrameworkCandidates extends ArrayList<String> {
+public class DevelopmentReloadingCandidates extends ArrayList<String> {
 
-    public TestFrameworkCandidates() {
-        super(Stream.of(TestFramework.values()).map(tf -> tf.toString().toLowerCase()).collect(Collectors.toList()));
+    public DevelopmentReloadingCandidates() {
+        super(Stream.of(DevelopmentReloading.values()).map(reloading -> reloading.toString().toLowerCase()).collect(Collectors.toList()));
     }
 }
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/TestFrameworkConverter.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java
similarity index 69%
rename from grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/TestFrameworkConverter.java
rename to grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java
index 96aa969327..fb2a5211bb 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/TestFrameworkConverter.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java
@@ -18,23 +18,23 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 import picocli.CommandLine;
 
-public class TestFrameworkConverter implements CommandLine.ITypeConverter<TestFramework> {
+public class DevelopmentReloadingConverter implements CommandLine.ITypeConverter<DevelopmentReloading> {
 
-    public static final TestFramework DEFAULT_TEST_FRAMEWORK = TestFramework.SPOCK;
+    public static final DevelopmentReloading DEFAULT_RELOADING = DevelopmentReloading.DEVTOOLS;
 
     @Override
-    public TestFramework convert(String value) throws Exception {
+    public DevelopmentReloading convert(String value) throws Exception {
         if (value == null) {
-            return DEFAULT_TEST_FRAMEWORK;
+            return DEFAULT_RELOADING;
         }
-        for (TestFramework bt : TestFramework.values()) {
+        for (DevelopmentReloading bt : DevelopmentReloading.values()) {
             if (value.equalsIgnoreCase(bt.toString())) {
                 return bt;
             }
         }
-        return DEFAULT_TEST_FRAMEWORK;
+        return DEFAULT_RELOADING;
     }
 }
diff --git a/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/CommandFixture.groovy b/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/CommandFixture.groovy
index 00c23f1536..8a87538a0f 100644
--- a/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/CommandFixture.groovy
+++ b/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/CommandFixture.groovy
@@ -27,10 +27,7 @@ import org.grails.forge.application.generator.ProjectGenerator
 import org.grails.forge.io.ConsoleOutput
 import org.grails.forge.io.FileSystemOutputHandler
 import org.grails.forge.io.OutputHandler
-import org.grails.forge.options.BuildTool
-import org.grails.forge.options.Language
 import org.grails.forge.options.Options
-import org.grails.forge.options.TestFramework
 import org.grails.forge.util.NameUtils
 
 trait CommandFixture {
@@ -54,4 +51,4 @@ trait CommandFixture {
         return () -> new FileSystemOutputHandler(dir, consoleOutput)
     }
 
-}
\ No newline at end of file
+}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java
index 80b8c28d95..408933655a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java
@@ -34,7 +34,7 @@ public class Generated {
     private final ApplicationType type;
     private final GormImpl gorm;
     private final ServletImpl servlet;
-    private final TestFramework testFramework;
+    private final DevelopmentReloading reloading;
     private final JdkVersion jdkVersion;
     private Collection<? extends SelectedFeature> features = new ArrayList<>();
     private final String grailsVersion;
@@ -44,12 +44,12 @@ public class Generated {
             @NonNull ApplicationType type,
             @NonNull GormImpl gorm,
             @NonNull ServletImpl servlet,
-            @NonNull TestFramework testFramework,
+            @NonNull DevelopmentReloading reloading,
             @NonNull JdkVersion jdkVersion) {
         this.type = Objects.requireNonNull(type, "Type cannot be null");
         this.gorm = Objects.requireNonNull(gorm, "GORM cannot be null");
         this.servlet = Objects.requireNonNull(servlet, "Embedded Servlet cannot be null");
-        this.testFramework = Objects.requireNonNull(testFramework, "Test framework cannot be null");
+        this.reloading = Objects.requireNonNull(reloading, "Development reloading cannot be null");
         this.jdkVersion = Objects.requireNonNull(jdkVersion, "JDK version cannot be null");
         this.grailsVersion = VersionInfo.getGrailsVersion();
     }
@@ -91,8 +91,8 @@ public class Generated {
     /**
      * @return The test framework
      */
-    public @NonNull TestFramework getTestFramework() {
-        return testFramework;
+    public @NonNull DevelopmentReloading getReloading() {
+        return reloading;
     }
 
     /**
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java
index 4b03e0ea26..0b950bcf79 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java
@@ -63,7 +63,7 @@ public class ContextFactory {
         }
 
         Options newOptions = options
-                .withTestFramework(determineTestFramework(options.getTestFramework()))
+                .withDevelopmentReloading(determineDevelopmentReloading(options.getDevelopmentReloading()))
                 .withGormImpl(determineGormImpl(options.getGormImpl()))
                 .withServletImpl(determineServletImpl(options.getServletImpl()));
 
@@ -89,11 +89,11 @@ public class ContextFactory {
         return new GeneratorContext(project, featureContext.getApplicationType(), featureContext.getOptions(), featureContext.getOperatingSystem(), featureList, coordinateResolver);
     }
 
-    TestFramework determineTestFramework(TestFramework testFramework) {
-        if (testFramework == null) {
-            testFramework = TestFramework.DEFAULT_OPTION;
+    DevelopmentReloading determineDevelopmentReloading(DevelopmentReloading reloading) {
+        if (reloading == null) {
+            reloading = DevelopmentReloading.DEFAULT_OPTION;
         }
-        return testFramework;
+        return reloading;
     }
 
     Language determineLanguage(Language language, Set<Feature> features) {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java
index d47895058d..71502385d3 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java
@@ -88,7 +88,7 @@ public class DefaultProjectGenerator implements ProjectGenerator {
         generatorContext.addTemplate("grailsCli",
                 new RockerTemplate("grails-forge-cli.yml",
                         cli.template(Language.DEFAULT_OPTION,
-                                generatorContext.getTestFramework(),
+                                generatorContext.getDevelopmentReloading(),
                                 BuildTool.DEFAULT_OPTION,
                                 generatorContext.getGorm(),
                                 generatorContext.getServlet(),
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java
index 7771a61944..d0713701b8 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java
@@ -204,11 +204,11 @@ public class GeneratorContext implements DependencyContext {
     }
 
     /**
-     * @return The test framework
+     * @return The development reloading
      */
     @NonNull
-    public TestFramework getTestFramework() {
-        return options.getTestFramework();
+    public DevelopmentReloading getDevelopmentReloading() {
+        return options.getDevelopmentReloading();
     }
 
     /**
@@ -286,20 +286,19 @@ public class GeneratorContext implements DependencyContext {
     }
 
     public String getTestSourcePath(String path) {
-        return getTestFramework().getSourcePath(path, Language.DEFAULT_OPTION);
+        return TestFramework.SPOCK.getSourcePath(path);
     }
 
     public String getIntegrationTestSourcePath(String path) {
-        return getTestFramework().getIntegrationSourcePath(path, Language.DEFAULT_OPTION);
+        return TestFramework.SPOCK.getIntegrationSourcePath(path);
     }
 
-    RockerModel parseModel(RockerModel javaTemplate,
-                           RockerModel groovyTemplate) {
+    RockerModel parseModel(RockerModel javaTemplate, RockerModel groovyTemplate) {
        return groovyTemplate;
     }
 
     public void addTemplate(String name, String path, TestRockerModelProvider testRockerModelProvider) {
-        RockerModel rockerModel = testRockerModelProvider.findModel(Language.DEFAULT_OPTION, getTestFramework());
+        RockerModel rockerModel = testRockerModelProvider.findModel(TestFramework.SPOCK);
         if (rockerModel != null) {
             addTemplate(name, new RockerTemplate(path, rockerModel));
         }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java
index ac74850eba..a4b43954c8 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java
@@ -22,8 +22,7 @@ import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.order.Ordered;
 import org.grails.forge.build.dependencies.Phase;
 import org.grails.forge.build.dependencies.Scope;
-import org.grails.forge.options.Language;
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 
 import java.util.Optional;
 
@@ -72,8 +71,7 @@ public enum GradleConfiguration implements Ordered {
 
     @NonNull
     public static Optional<GradleConfiguration> of(@NonNull Scope scope,
-                                                   @NonNull Language language,
-                                                   @NonNull TestFramework testFramework) {
+                                                   @NonNull DevelopmentReloading reloading) {
         switch (scope.getSource()) {
             case BUILD_SRC:
                 if (scope.getPhases().contains(Phase.BUILD)) {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java
index 36931c3dc2..7440148f40 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java
@@ -25,7 +25,6 @@ import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.build.dependencies.DependencyCoordinate;
-import org.grails.forge.options.Language;
 import org.grails.forge.template.Writable;
 
 import java.util.Comparator;
@@ -62,11 +61,10 @@ public class GradleDependency extends DependencyCoordinate {
                             @Nullable Writable extension) {
         super(dependency);
         gradleConfiguration = GradleConfiguration.of(
-                dependency.getScope(),
-                Language.DEFAULT_OPTION,
-                generatorContext.getTestFramework()
+            dependency.getScope(),
+            generatorContext.getDevelopmentReloading()
         ).orElseThrow(() ->
-                new IllegalArgumentException(String.format("Cannot map the dependency scope: [%s] to a Gradle specific scope", dependency.getScope())));
+            new IllegalArgumentException(String.format("Cannot map the dependency scope: [%s] to a Gradle specific scope", dependency.getScope())));
         this.extension = extension;
     }
 
@@ -112,7 +110,7 @@ public class GradleDependency extends DependencyCoordinate {
             snippet += "(";
         }
         snippet += "\"" + getGroupId() + ':' + getArtifactId() +
-                (getVersion() != null ? (':' + getVersion()) : "") + "\"";
+            (getVersion() != null ? (':' + getVersion()) : "") + "\"";
         if (isPom() || gradleConfiguration == INTEGRATION_TEST_IMPLEMENTATION_TEST_FIXTURES) {
             snippet += ")";
         }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/HasDefaultTest.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/HasDefaultDevelopmentReloading.java
similarity index 85%
rename from grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/HasDefaultTest.java
rename to grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/HasDefaultDevelopmentReloading.java
index dd82b992e0..ea8a009108 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/HasDefaultTest.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/HasDefaultDevelopmentReloading.java
@@ -18,8 +18,8 @@
  */
 package org.grails.forge.defaults;
 
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 
-public interface HasDefaultTest {
-    TestFramework getTest();
+public interface HasDefaultDevelopmentReloading {
+    DevelopmentReloading getReloading();
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java
index 5faf0a4207..b6e95a2e9d 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java
@@ -21,26 +21,26 @@ package org.grails.forge.defaults;
 import io.micronaut.core.annotation.Creator;
 import io.micronaut.core.annotation.Introspected;
 import org.grails.forge.options.BuildTool;
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.DevelopmentReloading;
 
 /**
  * Default values to be applied when a given
  * {@link org.grails.forge.options.Language} is selected
  */
 @Introspected
-public class LanguageDefaults implements HasDefaultTest, HasDefaultBuild {
+public class LanguageDefaults implements HasDefaultDevelopmentReloading, HasDefaultBuild {
 
-    TestFramework test;
+    DevelopmentReloading reloading;
     BuildTool build;
 
     @Creator
-    public LanguageDefaults(TestFramework test, BuildTool build) {
-        this.test = test;
+    public LanguageDefaults(DevelopmentReloading reloading, BuildTool build) {
+        this.reloading = reloading;
         this.build = build;
     }
 
-    public TestFramework getTest() {
-        return test;
+    public DevelopmentReloading getReloading() {
+        return reloading;
     }
 
     public BuildTool getBuild() {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java
index ebd8cfa997..62a2d4aeab 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java
@@ -95,7 +95,7 @@ public class FeatureDiffer {
         projectGenerator.generate(
                 applicationType,
                 project,
-                new Options(generatorContext.getTestFramework(), generatorContext.getJdkVersion()),
+                new Options(generatorContext.getDevelopmentReloading(), generatorContext.getJdkVersion()),
                 generatorContext.getOperatingSystem(),
                 Collections.emptyList(),
                 outputHandler,
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
index d66a927b79..f8dea471f4 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
@@ -21,11 +21,11 @@ package org.grails.forge.feature;
 import io.micronaut.core.annotation.Nullable;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
-import org.grails.forge.feature.test.TestFeature;
+import org.grails.forge.feature.reloading.ReloadingFeature;
 import org.grails.forge.io.ConsoleOutput;
+import org.grails.forge.options.DevelopmentReloading;
 import org.grails.forge.options.JdkVersion;
 import org.grails.forge.options.Options;
-import org.grails.forge.options.TestFramework;
 
 import java.util.*;
 
@@ -49,14 +49,14 @@ public class FeatureContext {
         this.applicationType = applicationType;
         this.operatingSystem = operatingSystem;
         this.selectedFeatures = selectedFeatures;
-        if (options.getTestFramework() == null) {
-            TestFramework testFramework = selectedFeatures.stream()
-                    .filter(TestFeature.class::isInstance)
-                    .map(TestFeature.class::cast)
-                    .map(TestFeature::getTestFramework)
-                    .findFirst()
-                    .orElseThrow(() -> new IllegalArgumentException(String.format("No test framework could derived from the selected features [%s]", selectedFeatures)));
-            options = options.withTestFramework(testFramework);
+        if (options.getDevelopmentReloading() == null) {
+            DevelopmentReloading reloading = selectedFeatures.stream()
+                .filter(ReloadingFeature.class::isInstance)
+                .map(ReloadingFeature.class::cast)
+                .map(ReloadingFeature::getReloading)
+                .findFirst()
+                .orElse(DevelopmentReloading.DEFAULT_OPTION);
+            options = options.withDevelopmentReloading(reloading);
         }
         this.options = options;
     }
@@ -78,7 +78,7 @@ public class FeatureContext {
 
     public Set<Feature> getFinalFeatures(ConsoleOutput consoleOutput) {
         return features.stream().filter(feature -> {
-            for (FeaturePredicate predicate: exclusions) {
+            for (FeaturePredicate predicate : exclusions) {
                 if (predicate.test(feature)) {
                     predicate.getWarning().ifPresent(message -> {
                         throw new IllegalArgumentException(message);
@@ -90,8 +90,8 @@ public class FeatureContext {
         }).collect(collectingAndThen(toSet(), Collections::unmodifiableSet));
     }
 
-    public TestFramework getTestFramework() {
-        return options.getTestFramework();
+    public DevelopmentReloading getDevelopmentReloading() {
+        return options.getDevelopmentReloading();
     }
 
     public JdkVersion getJavaVersion() {
@@ -122,9 +122,9 @@ public class FeatureContext {
 
     public boolean isPresent(Class<? extends Feature> feature) {
         return features.stream()
-                .filter(f -> exclusions.stream().noneMatch(e -> e.test(f)))
-                .map(Feature::getClass)
-                .anyMatch(feature::isAssignableFrom);
+            .filter(f -> exclusions.stream().noneMatch(e -> e.test(f)))
+            .map(Feature::getClass)
+            .anyMatch(feature::isAssignableFrom);
     }
 
     public OperatingSystem getOperatingSystem() {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java
index ebdf8791c5..75cded6bf6 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java
@@ -20,7 +20,7 @@ package org.grails.forge.feature;
 
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.lang.LanguageFeature;
-import org.grails.forge.feature.test.TestFeature;
+import org.grails.forge.feature.reloading.ReloadingFeature;
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.JdkVersion;
@@ -42,7 +42,7 @@ public class Features extends ArrayList<String> {
     private final GeneratorContext context;
     private ApplicationFeature applicationFeature;
     private LanguageFeature languageFeature;
-    private TestFeature testFeature;
+    private ReloadingFeature reloadingFeature;
     private final JdkVersion javaVersion;
 
     public Features(GeneratorContext context, Set<Feature> featureList, Options options) {
@@ -56,8 +56,8 @@ public class Features extends ArrayList<String> {
             if (languageFeature == null && feature instanceof LanguageFeature) {
                 languageFeature = (LanguageFeature) feature;
             }
-            if (testFeature == null && feature instanceof TestFeature) {
-                testFeature = (TestFeature) feature;
+            if (reloadingFeature == null && feature instanceof ReloadingFeature) {
+                reloadingFeature = (ReloadingFeature) feature;
             }
         }
         this.javaVersion = options.getJavaVersion();
@@ -77,8 +77,8 @@ public class Features extends ArrayList<String> {
         return languageFeature;
     }
 
-    public TestFeature testFramework() {
-        return testFeature;
+    public ReloadingFeature reloading() {
+        return reloadingFeature;
     }
 
     public Set<Feature> getFeatures() {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw
index f75be4186f..1184c7af4a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/buildGradle.rocker.raw
@@ -26,7 +26,6 @@ under the License.
 @import org.grails.forge.build.gradle.GradleDsl
 @import org.grails.forge.build.gradle.GradlePlugin
 @import org.grails.forge.feature.Features
-@import org.grails.forge.options.TestFramework
 @import org.grails.forge.util.VersionInfo
 @import org.grails.forge.options.JdkVersion
 @import org.grails.forge.build.gradle.GradleDependency
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cli.rocker.raw b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cli.rocker.raw
index f949cbec01..884900ffb3 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cli.rocker.raw
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cli.rocker.raw
@@ -18,7 +18,7 @@ under the License.
 *@
 
 @import org.grails.forge.options.Language
-@import org.grails.forge.options.TestFramework
+@import org.grails.forge.options.DevelopmentReloading
 @import org.grails.forge.options.BuildTool
 @import org.grails.forge.options.GormImpl
 @import org.grails.forge.options.ServletImpl
@@ -29,7 +29,7 @@ under the License.
 
 @args (
 Language language,
-TestFramework testFramework,
+DevelopmentReloading reloading,
 BuildTool buildTool,
 GormImpl gormImpl,
 ServletImpl servletImpl,
@@ -40,7 +40,7 @@ ApplicationType applicationType
 
 applicationType: @applicationType.getName()
 defaultPackage: @project.getPackageName()
-testFramework: @testFramework.getName()
+reloading: @reloading.getName()
 sourceLanguage: @language.getName()
 buildTool: @buildTool.getName()
 gormImpl: @gormImpl.getName()
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java
index 44a85a1daf..1f39980177 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java
@@ -28,7 +28,7 @@ import org.grails.forge.feature.Category;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.config.ApplicationConfiguration;
 import org.grails.forge.feature.config.Configuration;
-import org.grails.forge.options.TestFramework;
+import org.grails.forge.feature.test.Spock;
 import org.grails.forge.template.StringTemplate;
 
 import java.util.Optional;
@@ -74,12 +74,13 @@ public class TestContainers implements Feature {
                     testConfig.put(driverConfiguration.getDriverKey(), driver);
                 });
                 artifactIdForDriverFeature(driverFeature).ifPresent(dependencyArtifactId ->
-                        generatorContext.addDependency(testContainerTestDependency(dependencyArtifactId)));
+                    generatorContext.addDependency(testContainerTestDependency(dependencyArtifactId)));
             });
         });
-        testContainerArtifactIdByTestFramework(generatorContext.getTestFramework()).ifPresent(testArtifactId -> {
-            generatorContext.addDependency(testContainerTestDependency(testArtifactId));
-        });
+
+        if (generatorContext.isFeaturePresent(Spock.class)) {
+            generatorContext.addDependency(testContainerTestDependency("spock"));
+        }
 
         if (generatorContext.isFeaturePresent(MongoFeature.class) || generatorContext.isFeaturePresent(MongoGorm.class)) {
             generatorContext.addDependency(testContainerTestDependency("mongodb"));
@@ -89,19 +90,9 @@ public class TestContainers implements Feature {
     @NonNull
     private static Dependency.Builder testContainerTestDependency(@NonNull String artifactId) {
         return Dependency.builder()
-                .groupId(TESTCONTAINERS_GROUP_ID)
-                .artifactId(artifactId)
-                .testImplementation();
-    }
-
-    @NonNull
-    private static Optional<String> testContainerArtifactIdByTestFramework(TestFramework testFramework) {
-        if (testFramework == TestFramework.SPOCK) {
-            return Optional.of("spock");
-        } else if (testFramework == TestFramework.JUNIT) {
-            return Optional.of("junit-jupiter");
-        }
-        return Optional.empty();
+            .groupId(TESTCONTAINERS_GROUP_ID)
+            .artifactId(artifactId)
+            .testImplementation();
     }
 
     @NonNull
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java
index 97f09bf72e..f5b9f8d87c 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java
@@ -21,6 +21,7 @@ package org.grails.forge.feature.reloading;
 import jakarta.inject.Singleton;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.gradle.GradlePlugin;
+import org.grails.forge.options.DevelopmentReloading;
 
 @Singleton
 public class Jrebel implements ReloadingFeature {
@@ -40,6 +41,11 @@ public class Jrebel implements ReloadingFeature {
         return "Adds support for class reloading with JRebel (requires separate JRebel installation)";
     }
 
+    @Override
+    public DevelopmentReloading getReloading() {
+        return DevelopmentReloading.JREBEL;
+    }
+
     @Override
     public void apply(GeneratorContext generatorContext) {
         generatorContext.getBuildProperties().addComment("TODO: Replace with agent path from JRebel installation; see documentation");
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/ReloadingFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/ReloadingFeature.java
index cd902115f4..cf48d517b5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/ReloadingFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/ReloadingFeature.java
@@ -21,6 +21,7 @@ package org.grails.forge.feature.reloading;
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Category;
 import org.grails.forge.feature.OneOfFeature;
+import org.grails.forge.options.DevelopmentReloading;
 
 public interface ReloadingFeature extends OneOfFeature {
 
@@ -38,4 +39,6 @@ public interface ReloadingFeature extends OneOfFeature {
     default String getCategory() {
         return Category.DEV_TOOLS;
     }
+
+    DevelopmentReloading getReloading();
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
index 4456b6d275..7b77d07349 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
@@ -25,6 +25,7 @@ import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.build.dependencies.Scope;
 import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
+import org.grails.forge.options.DevelopmentReloading;
 import org.grails.forge.options.Options;
 
 import java.util.Set;
@@ -73,4 +74,9 @@ public class SpringBootDevTools implements ReloadingFeature, DefaultFeature {
     public String getDocumentation() {
         return "https://docs.spring.io/spring-boot/reference/using/devtools.html";
     }
+
+    @Override
+    public DevelopmentReloading getReloading() {
+        return DevelopmentReloading.DEVTOOLS;
+    }
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java
deleted file mode 100644
index 2c57f3308b..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJ.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test;
-
-import jakarta.inject.Singleton;
-import org.grails.forge.application.ApplicationType;
-import org.grails.forge.application.generator.GeneratorContext;
-import org.grails.forge.build.dependencies.Dependency;
-import org.grails.forge.feature.Category;
-import org.grails.forge.feature.Feature;
-
-@Singleton
-public class AssertJ implements Feature {
-
-    @Override
-    public String getName() {
-        return "assertj";
-    }
-
-    @Override
-    public String getTitle() {
-        return "AssertJ Framework";
-    }
-
-    @Override
-    public String getDescription() {
-        return "AssertJ fluent assertions framework";
-    }
-
-    @Override
-    public boolean supports(ApplicationType applicationType) {
-        return true;
-    }
-
-    @Override
-    public void apply(GeneratorContext generatorContext) {
-        generatorContext.addDependency(Dependency.builder()
-                .groupId("org.assertj")
-                .artifactId("assertj-core")
-                .testImplementation());
-    }
-
-    @Override
-    public String getCategory() {
-        return Category.TESTING;
-    }
-
-    @Override
-    public String getThirdPartyDocumentation() {
-        return "https://assertj.github.io/doc/";
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJValidator.java
deleted file mode 100644
index 142dc3185f..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/AssertJValidator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test;
-
-import jakarta.inject.Singleton;
-import org.grails.forge.application.ApplicationType;
-import org.grails.forge.feature.Feature;
-import org.grails.forge.feature.validation.FeatureValidator;
-import org.grails.forge.options.Options;
-
-import java.util.Set;
-
-@Singleton
-public class AssertJValidator implements FeatureValidator {
-    @Override
-    public void validatePreProcessing(Options options, ApplicationType applicationType, Set<Feature> features) {
-        if (features.stream().anyMatch(f -> f instanceof AssertJ)) {
-            if (features.stream().noneMatch(f -> (f instanceof Junit))) {
-                throw new IllegalArgumentException("AssertJ requires JUnit.");
-            }
-        }
-    }
-
-    @Override
-    public void validatePostProcessing(Options options, ApplicationType applicationType, Set<Feature> features) {
-
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java
index e3646843eb..d91f61c909 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java
@@ -29,7 +29,6 @@ import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.FeatureContext;
 import org.grails.forge.feature.FeaturePhase;
-import org.grails.forge.feature.test.template.groovyJunit;
 import org.grails.forge.options.*;
 import org.grails.forge.template.RockerTemplate;
 
@@ -46,7 +45,7 @@ public class GebWithTestcontainers implements DefaultFeature {
 
     @Override
     public boolean shouldApply(ApplicationType applicationType, Options options, Set<Feature> selectedFeatures) {
-        return applicationType == ApplicationType.WEB && options.getTestFramework() != TestFramework.JUNIT;
+        return applicationType == ApplicationType.WEB;
     }
 
     @NonNull
@@ -107,13 +106,12 @@ public class GebWithTestcontainers implements DefaultFeature {
 
         Project project = generatorContext.getProject();
         TestRockerModelProvider provider = new DefaultTestRockerModelProvider(
-                org.grails.forge.feature.test.template.spock.template(project),
-                groovyJunit.template(project)
+                org.grails.forge.feature.test.template.spock.template(project)
         );
         generatorContext.addTemplate("applicationTest",
                 new RockerTemplate(
                         generatorContext.getIntegrationTestSourcePath("/{packagePath}/{className}"),
-                        provider.findModel(Language.DEFAULT_OPTION, generatorContext.getTestFramework())
+                        provider.findModel(TestFramework.SPOCK)
                 )
         );
     }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java
index 23b8ede958..c27ee16d77 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java
@@ -26,7 +26,6 @@ import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.build.gradle.GradlePlugin;
 import org.grails.forge.feature.*;
-import org.grails.forge.feature.test.template.groovyJunit;
 import org.grails.forge.feature.test.template.webdriverBinariesPlugin;
 import org.grails.forge.options.*;
 import org.grails.forge.template.RockerTemplate;
@@ -131,13 +130,12 @@ public class GebWithWebDriverBinaries implements Feature {
 
         Project project = generatorContext.getProject();
         TestRockerModelProvider provider = new DefaultTestRockerModelProvider(
-                org.grails.forge.feature.test.template.spock.template(project),
-                groovyJunit.template(project)
+                org.grails.forge.feature.test.template.spock.template(project)
         );
         generatorContext.addTemplate("applicationTest",
                 new RockerTemplate(
                         generatorContext.getIntegrationTestSourcePath("/{packagePath}/{className}"),
-                        provider.findModel(Language.DEFAULT_OPTION, generatorContext.getTestFramework())
+                        provider.findModel(TestFramework.SPOCK)
                 )
         );
         generatorContext.addTemplate("gebConfig",
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java
deleted file mode 100644
index 6c48a76114..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Hamcrest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test;
-
-import jakarta.inject.Singleton;
-import org.grails.forge.application.ApplicationType;
-import org.grails.forge.application.generator.GeneratorContext;
-import org.grails.forge.build.dependencies.Dependency;
-import org.grails.forge.feature.Category;
-import org.grails.forge.feature.Feature;
-
-@Singleton
-public class Hamcrest  implements Feature {
-
-    @Override
-    public String getName() {
-        return "hamcrest";
-    }
-
-    @Override
-    public String getTitle() {
-        return "Hamcrest";
-    }
-
-    @Override
-    public String getDescription() {
-        return "Hamcrest matchers for JUnit";
-    }
-
-    @Override
-    public String getCategory() {
-        return Category.TESTING;
-    }
-
-    @Override
-    public boolean supports(ApplicationType applicationType) {
-        return true;
-    }
-
-    @Override
-    public String getThirdPartyDocumentation() {
-        return "https://hamcrest.org/JavaHamcrest/";
-    }
-
-    @Override
-    public void apply(GeneratorContext generatorContext) {
-        generatorContext.addDependency(Dependency.builder()
-                .groupId("org.hamcrest")
-                .artifactId("hamcrest")
-                .testImplementation());
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/HamcrestValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/HamcrestValidator.java
deleted file mode 100644
index c25e21c7cf..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/HamcrestValidator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test;
-
-import jakarta.inject.Singleton;
-import org.grails.forge.application.ApplicationType;
-import org.grails.forge.feature.Feature;
-import org.grails.forge.feature.validation.FeatureValidator;
-import org.grails.forge.options.Options;
-
-import java.util.Set;
-
-@Singleton
-public class HamcrestValidator  implements FeatureValidator {
-    @Override
-    public void validatePreProcessing(Options options, ApplicationType applicationType, Set<Feature> features) {
-        if (features.stream().anyMatch(f -> f instanceof Hamcrest)) {
-            if (features.stream().noneMatch(f -> (f instanceof Junit))) {
-                throw new IllegalArgumentException("Hamcrest requires JUnit.");
-            }
-        }
-    }
-
-    @Override
-    public void validatePostProcessing(Options options, ApplicationType applicationType, Set<Feature> features) {
-
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java
deleted file mode 100644
index 962fa89c2e..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Junit.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test;
-
-import io.micronaut.core.annotation.NonNull;
-import jakarta.inject.Singleton;
-import org.grails.forge.application.ApplicationType;
-import org.grails.forge.application.generator.GeneratorContext;
-import org.grails.forge.build.dependencies.Dependency;
-import org.grails.forge.feature.DefaultFeature;
-import org.grails.forge.feature.Feature;
-import org.grails.forge.options.Options;
-import org.grails.forge.options.TestFramework;
-
-import java.util.Set;
-
-@Singleton
-public class Junit implements TestFeature, DefaultFeature {
-
-    @Override
-    public String getTitle() {
-        return "JUnit 5";
-    }
-
-    @NonNull
-    @Override
-    public String getName() {
-        return "junit";
-    }
-
-    @NonNull
-    @Override
-    public String getDescription() {
-        return "Configure JUnit 5 for Grails application.";
-    }
-
-    @Override
-    public void doApply(GeneratorContext generatorContext) {
-        generatorContext.addDependency(Dependency.builder()
-                .groupId("org.junit.jupiter")
-                .artifactId("junit-jupiter")
-                .testImplementation());
-    }
-
-    @Override
-    public TestFramework getTestFramework() {
-        return TestFramework.JUNIT;
-    }
-
-    @Override
-    public boolean shouldApply(ApplicationType applicationType, Options options, Set<Feature> selectedFeatures) {
-        return options.getTestFramework() == TestFramework.JUNIT;
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java
index 73f73154a5..02cf19a937 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java
@@ -64,7 +64,7 @@ public class Mockito implements DefaultFeature {
 
     @Override
     public boolean shouldApply(ApplicationType applicationType, Options options, Set<Feature> selectedFeatures) {
-        return selectedFeatures.stream().anyMatch(f -> f instanceof TestFeature);
+        return selectedFeatures.stream().anyMatch(f -> f instanceof Spock);
     }
 
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java
index 9316d60178..6acafa48f6 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java
@@ -31,7 +31,7 @@ public class MockitoValidator implements FeatureValidator {
     @Override
     public void validatePreProcessing(Options options, ApplicationType applicationType, Set<Feature> features) {
         if (features.stream().anyMatch(f -> f instanceof Mockito)) {
-            if (features.stream().noneMatch(f -> (f instanceof Junit || f instanceof Spock))) {
+            if (features.stream().noneMatch(f -> (f instanceof Spock))) {
                 throw new IllegalArgumentException("Mockito requires JUnit or Spock.");
             }
         }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java
index 0ae0275df8..b897413111 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java
@@ -25,12 +25,11 @@ import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
-import org.grails.forge.options.TestFramework;
 
 import java.util.Set;
 
 @Singleton
-public class Spock implements TestFeature, DefaultFeature {
+public class Spock implements Feature, DefaultFeature {
 
     @Override
     public String getName() {
@@ -38,7 +37,12 @@ public class Spock implements TestFeature, DefaultFeature {
     }
 
     @Override
-    public void doApply(GeneratorContext generatorContext) {
+    public boolean supports(ApplicationType applicationType) {
+        return true;
+    }
+
+    @Override
+    public void apply(GeneratorContext generatorContext) {
         generatorContext.addDependency(Dependency.builder()
                         .groupId("org.spockframework")
                         .artifactId("spock-core")
@@ -46,13 +50,8 @@ public class Spock implements TestFeature, DefaultFeature {
                 .build());
     }
 
-    @Override
-    public TestFramework getTestFramework() {
-        return TestFramework.SPOCK;
-    }
-
     @Override
     public boolean shouldApply(ApplicationType applicationType, Options options, Set<Feature> selectedFeatures) {
-        return options.getTestFramework() == null || options.getTestFramework() == TestFramework.SPOCK;
+        return true;
     }
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/TestFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/TestFeature.java
deleted file mode 100644
index 8811e97d99..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/TestFeature.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test;
-
-import org.grails.forge.application.ApplicationType;
-import org.grails.forge.application.generator.GeneratorContext;
-import org.grails.forge.feature.Category;
-import org.grails.forge.feature.FeaturePhase;
-import org.grails.forge.feature.OneOfFeature;
-import org.grails.forge.options.TestFramework;
-
-public interface TestFeature extends OneOfFeature {
-
-    @Override
-    default Class<?> getFeatureClass() {
-        return TestFeature.class;
-    }
-
-    @Override
-    default boolean isVisible() {
-        return false;
-    }
-
-    @Override
-    default int getOrder() {
-        return FeaturePhase.TEST.getOrder();
-    }
-
-    @Override
-    default String getCategory() {
-        return Category.TESTING;
-    }
-
-    @Override
-    default void apply(GeneratorContext generatorContext) {
-        doApply(generatorContext);
-    }
-
-    void doApply(GeneratorContext generatorContext);
-
-    TestFramework getTestFramework();
-
-    default boolean isJunit() {
-        return getTestFramework() == TestFramework.JUNIT;
-    }
-
-    default boolean isSpock() {
-        return getTestFramework() == TestFramework.SPOCK;
-    }
-
-    @Override
-    default boolean supports(ApplicationType applicationType) {
-        return true;
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/template/javaJunit.rocker.raw b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/template/javaJunit.rocker.raw
deleted file mode 100644
index 4bb7a6aa84..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/template/javaJunit.rocker.raw
+++ /dev/null
@@ -1,49 +0,0 @@
-@*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
-*@
-
-@import org.grails.forge.application.Project
-
-@args (
-Project project
-)
-
-@if (project.getPackageName() != null) {
-package @project.getPackageName();
-}
-
-
-import io.micronaut.runtime.EmbeddedApplication;
-import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Assertions;
-
-import jakarta.inject.Inject;
-
-@@MicronautTest
-class @project.getClassName()Test {
-
-    @@Inject
-    EmbeddedApplication<?> application;
-
-    @@Test
-    void testItWorks() {
-        Assertions.assertTrue(application.isRunning());
-    }
-
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/AbstractJunitRockerModelProvider.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/AbstractJunitRockerModelProvider.java
deleted file mode 100644
index 04c291e9ea..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/AbstractJunitRockerModelProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.options;
-
-import org.grails.forge.application.Project;
-
-/**
- * Abstract implementation for {@link JunitRockerModelProvider} which supplies a {@link Project} in the constructor. You can use it to provide rocker models for each language supported by {@link TestFramework#JUNIT}.
- * @author Sergio del Amo
- */
-public abstract class AbstractJunitRockerModelProvider implements JunitRockerModelProvider {
-
-    private final Project project;
-
-    public AbstractJunitRockerModelProvider(Project project) {
-        this.project = project;
-    }
-
-    public Project getProject() {
-        return this.project;
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/AbstractTestRockerModelProvider.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/AbstractTestRockerModelProvider.java
deleted file mode 100644
index 9cac7285ed..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/AbstractTestRockerModelProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.options;
-
-import org.grails.forge.application.Project;
-
-/**
- * Defines an abstract class to be extended to provide a{ @link RockerModel} to create {@link com.fizzed.rocker.RockerTemplate} for tests generated by the CLI and Launch for the different {@link Language} and {@link TestFramework} valid combinations.
- * @author Sergio del Amo
- */
-public abstract class AbstractTestRockerModelProvider extends AbstractJunitRockerModelProvider
-        implements TestRockerModelProvider {
-
-    public AbstractTestRockerModelProvider(Project project) {
-        super(project);
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DefaultTestRockerModelProvider.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DefaultTestRockerModelProvider.java
index 9f25f4b266..d3e4f08785 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DefaultTestRockerModelProvider.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DefaultTestRockerModelProvider.java
@@ -22,12 +22,9 @@ import com.fizzed.rocker.RockerModel;
 
 public class DefaultTestRockerModelProvider implements TestRockerModelProvider {
     private final RockerModel spock;
-    private final RockerModel groovyJunit;
 
-    public DefaultTestRockerModelProvider(RockerModel spock,
-                                          RockerModel groovyJunit) {
+    public DefaultTestRockerModelProvider(RockerModel spock) {
         this.spock = spock;
-        this.groovyJunit = groovyJunit;
     }
 
     @Override
@@ -35,9 +32,4 @@ public class DefaultTestRockerModelProvider implements TestRockerModelProvider {
         return spock;
     }
 
-    @Override
-    public RockerModel groovyJunit() {
-        return groovyJunit;
-    }
-
 }
diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFramework.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java
similarity index 71%
rename from grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFramework.java
rename to grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java
index 6bfe7bd9f1..7408e09b52 100644
--- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/TestFramework.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java
@@ -16,17 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.grails.forge.api;
+package org.grails.forge.options;
 
 import io.micronaut.core.annotation.NonNull;
 
 import java.util.Locale;
 
-public enum TestFramework {
-    JUNIT,
-    SPOCK;
+public enum DevelopmentReloading {
 
-    static final TestFramework DEFAULT_OPTION = SPOCK;
+    DEVTOOLS,
+    JREBEL,
+    NONE;
+
+    public static final DevelopmentReloading DEFAULT_OPTION = DEVTOOLS;
 
     @Override
     public String toString() {
@@ -38,14 +40,11 @@ public enum TestFramework {
         return name().toLowerCase(Locale.ENGLISH);
     }
 
-    public org.grails.forge.options.TestFramework toTestFramework() {
-        switch (this) {
-            case SPOCK:
-                return org.grails.forge.options.TestFramework.SPOCK;
-            default:
-            case JUNIT:
-                return org.grails.forge.options.TestFramework.JUNIT;
-        }
+    public DevelopmentReloading toDevelopmentReloading() {
+        return switch (this) {
+            case DEVTOOLS -> DevelopmentReloading.DEVTOOLS;
+            case JREBEL -> DevelopmentReloading.JREBEL;
+            default -> DevelopmentReloading.NONE;
+        };
     }
-
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/FeatureFilter.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/FeatureFilter.java
index dec20f6f65..a0cc294b4e 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/FeatureFilter.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/FeatureFilter.java
@@ -23,8 +23,8 @@ import io.micronaut.core.annotation.Introspected;
 
 @Introspected
 public class FeatureFilter {
-    @JsonProperty("test")
-    private TestFramework test;
+    @JsonProperty("reloading")
+    private DevelopmentReloading reloading;
     @JsonProperty("gorm")
     private GormImpl gorm;
     @JsonProperty("servlet")
@@ -32,12 +32,12 @@ public class FeatureFilter {
     @JsonProperty("javaVersion")
     private JdkVersion javaVersion;
 
-    public TestFramework getTest() {
-        return test;
+    public DevelopmentReloading getReloading() {
+        return reloading;
     }
 
-    public void setTest(TestFramework test) {
-        this.test = test;
+    public void setReloading(DevelopmentReloading reloading) {
+        this.reloading = reloading;
     }
 
     public GormImpl getGorm() {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/JunitRockerModelProvider.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/JunitRockerModelProvider.java
deleted file mode 100644
index 382cc37702..0000000000
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/JunitRockerModelProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.options;
-
-import com.fizzed.rocker.RockerModel;
-
-public interface JunitRockerModelProvider {
-    /**
-     *
-     * @param language Selected language
-     * @return A {@link RockerModel}
-     * @throws IllegalArgumentException if the test combination is not handled
-     */
-    default RockerModel findJunitModel(Language language) {
-        switch (language) {
-            case GROOVY:
-                return groovyJunit();
-            default:
-                throw new IllegalArgumentException("unable to find a junit RockerModel for lang: " + language.getName());
-        }
-    }
-
-    /**
-     *
-     * @return {@link RockerModel} for {@link TestFramework#JUNIT} and {@link Language#GROOVY}
-     */
-    RockerModel groovyJunit();
-
-}
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java
index d5efd365a0..a110247a31 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java
@@ -28,7 +28,7 @@ import java.util.Locale;
 import java.util.Set;
 
 public enum Language implements IncludesDefaults<LanguageDefaults> {
-    GROOVY("groovy", new LanguageDefaults(TestFramework.SPOCK, BuildTool.GRADLE));
+    GROOVY("groovy", new LanguageDefaults(DevelopmentReloading.DEVTOOLS, BuildTool.GRADLE));
 
     public static final Language DEFAULT_OPTION = GROOVY;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
index f510ffd0a5..b3ab6a01bb 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
@@ -30,21 +30,21 @@ public class Options implements ConvertibleValues<Object> {
 
     private final OperatingSystem operatingSystem;
 
-    private final TestFramework testFramework;
+    private final DevelopmentReloading reloading;
     private final BuildTool buildTool;
     private final GormImpl gormImpl;
     private final ServletImpl servletImpl;
     private final JdkVersion javaVersion;
     private final ConvertibleValuesMap<Object> additionalOptions;
 
-    public Options(TestFramework testFramework,
+    public Options(DevelopmentReloading reloading,
                    GormImpl gormImpl,
                    ServletImpl servletImpl,
                    JdkVersion javaVersion,
                    OperatingSystem operatingSystem,
                    Map<String, Object> additionalOptions) {
 
-        this.testFramework = testFramework;
+        this.reloading = reloading;
         this.buildTool = BuildTool.DEFAULT_OPTION;
         this.gormImpl = gormImpl;
         this.servletImpl = servletImpl;
@@ -53,56 +53,56 @@ public class Options implements ConvertibleValues<Object> {
         this.additionalOptions = new ConvertibleValuesMap<>(additionalOptions);
     }
 
-    public Options(TestFramework testFramework,
+    public Options(DevelopmentReloading reloading,
                    GormImpl gormImpl,
                    ServletImpl servletImpl,
                    JdkVersion javaVersion,
                    OperatingSystem operatingSystem) {
 
-        this(testFramework, gormImpl, servletImpl, javaVersion, operatingSystem, Collections.emptyMap());
+        this(reloading, gormImpl, servletImpl, javaVersion, operatingSystem, Collections.emptyMap());
     }
 
-    public Options(TestFramework testFramework,
+    public Options(DevelopmentReloading reloading,
                    JdkVersion javaVersion,
                    OperatingSystem operatingSystem) {
 
-        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, javaVersion, operatingSystem, Collections.emptyMap());
+        this(reloading, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, javaVersion, operatingSystem, Collections.emptyMap());
     }
 
-    public Options(TestFramework testFramework,
+    public Options(DevelopmentReloading reloading,
                    OperatingSystem operatingSystem) {
 
-        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, VersionInfo.getJavaVersion(), operatingSystem, Collections.emptyMap());
+        this(reloading, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, VersionInfo.getJavaVersion(), operatingSystem, Collections.emptyMap());
     }
 
-    public Options(TestFramework testFramework,
+    public Options(DevelopmentReloading reloading,
                    GormImpl gormImpl,
                    ServletImpl servletImpl,
                    JdkVersion javaVersion) {
 
-        this(testFramework, gormImpl, servletImpl, javaVersion, OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(reloading, gormImpl, servletImpl, javaVersion, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
-    public Options(TestFramework testFramework,
+    public Options(DevelopmentReloading reloading,
                    JdkVersion javaVersion) {
 
-        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, javaVersion, OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(reloading, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, javaVersion, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
-    public Options(TestFramework testFramework) {
-        this(testFramework, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
+    public Options(DevelopmentReloading reloading) {
+        this(reloading, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
     public Options() {
-        this(TestFramework.DEFAULT_OPTION, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
+        this(DevelopmentReloading.DEFAULT_OPTION, GormImpl.DEFAULT_OPTION, ServletImpl.DEFAULT_OPTION, JdkVersion.DEFAULT_OPTION, OperatingSystem.DEFAULT, Collections.emptyMap());
     }
 
     public OperatingSystem getOperatingSystem() {
         return operatingSystem;
     }
 
-    public TestFramework getTestFramework() {
-        return testFramework;
+    public DevelopmentReloading getDevelopmentReloading() {
+        return reloading;
     }
 
     public BuildTool getBuildTool() {
@@ -137,22 +137,22 @@ public class Options implements ConvertibleValues<Object> {
     }
 
     public Options withOperatingSystem(OperatingSystem operatingSystem) {
-        return new Options(testFramework, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
+        return new Options(reloading, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
     }
 
-    public Options withTestFramework(TestFramework testFramework) {
-        return new Options(testFramework, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
+    public Options withDevelopmentReloading(DevelopmentReloading reloading) {
+        return new Options(reloading, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
     }
 
     public Options withGormImpl(GormImpl gormImpl) {
-        return new Options(testFramework, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
+        return new Options(reloading, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
     }
 
     public Options withServletImpl(ServletImpl servletImpl) {
-        return new Options(testFramework, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
+        return new Options(reloading, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
     }
 
     public Options withJavaVersion(JdkVersion javaVersion) {
-        return new Options(testFramework, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
+        return new Options(reloading, gormImpl, servletImpl, javaVersion, operatingSystem, additionalOptions.asMap());
     }
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java
index 0390372ae3..32f75e126f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java
@@ -20,13 +20,11 @@ package org.grails.forge.options;
 
 import io.micronaut.core.annotation.NonNull;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 
 public enum TestFramework {
-    JUNIT,
     SPOCK;
 
     public static final TestFramework DEFAULT_OPTION = SPOCK;
@@ -41,42 +39,16 @@ public enum TestFramework {
         return name().toLowerCase(Locale.ENGLISH);
     }
 
-    public String getSourcePath(String path, Language language) {
-        switch (this) {
-            case SPOCK:
-                return Language.GROOVY.getTestSrcDir() + path + getTestFrameworkSuffix() + Language.GROOVY.getExtension();
-            case JUNIT:
-            default:
-                if (language != null) {
-                    return language.getTestSrcDir() + path + getTestFrameworkSuffix()  + language.getExtension();
-                } else {
-                    return Language.GROOVY.getTestSrcDir() + path + getTestFrameworkSuffix() + Language.GROOVY.getExtension();
-                }
-        }
+    public String getSourcePath(String path) {
+        return Language.GROOVY.getTestSrcDir() + path + getTestFrameworkSuffix() + Language.GROOVY.getExtension();
     }
 
-    public String getIntegrationSourcePath(String path, Language language) {
-        switch (this) {
-            case SPOCK:
-                return Language.GROOVY.getIntegrationSrcDir() + path + getTestFrameworkSuffix() + Language.GROOVY.getExtension();
-            case JUNIT:
-            default:
-                if (language != null) {
-                    return language.getIntegrationSrcDir() + path + getTestFrameworkSuffix()  + language.getExtension();
-                } else {
-                    return Language.GROOVY.getIntegrationSrcDir() + path + getTestFrameworkSuffix() + Language.GROOVY.getExtension();
-                }
-        }
+    public String getIntegrationSourcePath(String path) {
+        return Language.GROOVY.getIntegrationSrcDir() + path + getTestFrameworkSuffix() + Language.GROOVY.getExtension();
     }
 
     public String getTestFrameworkSuffix() {
-        switch (this) {
-            case SPOCK:
-                return "Spec.";
-            case JUNIT:
-            default:
-                return "Test.";
-        }
+        return "Spec.";
     }
 
     /**
@@ -87,8 +59,6 @@ public enum TestFramework {
         switch (this) {
             case SPOCK:
                 return Collections.singletonList(Language.GROOVY);
-            case JUNIT:
-                return Arrays.asList(Language.GROOVY);
             default:
                 throw new RuntimeException("No list of supported languages have been defined for " + this.getName());
         }
@@ -101,7 +71,6 @@ public enum TestFramework {
     public Language getDefaultLanguage() {
         switch (this) {
             case SPOCK:
-            case JUNIT:
                 return Language.GROOVY;
             default:
                 throw new RuntimeException("No default language have been defined for " + this.getName());
@@ -109,9 +78,6 @@ public enum TestFramework {
     }
 
     public org.grails.forge.options.TestFramework toTestFramework() {
-        return switch (this) {
-            case SPOCK -> TestFramework.SPOCK;
-            default -> TestFramework.JUNIT;
-        };
+        return TestFramework.SPOCK;
     }
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestRockerModelProvider.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestRockerModelProvider.java
index c032e1fd16..b172992610 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestRockerModelProvider.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestRockerModelProvider.java
@@ -20,23 +20,20 @@ package org.grails.forge.options;
 
 import com.fizzed.rocker.RockerModel;
 
-public interface TestRockerModelProvider extends JunitRockerModelProvider {
+public interface TestRockerModelProvider {
 
     /**
      *
-     * @param language Selected language
      * @param testFramework selected test framework
      * @return A {@link RockerModel}
      * @throws IllegalArgumentException if the test framework / language combination is not handled
      */
-    default RockerModel findModel(Language language, TestFramework testFramework) throws IllegalArgumentException {
+    default RockerModel findModel(TestFramework testFramework) throws IllegalArgumentException {
         switch (testFramework) {
-            case JUNIT:
-                return findJunitModel(language);
             case SPOCK:
                 return spock();
             default:
-                throw new IllegalArgumentException("unable to find a RockerModel for lang: " + language.getName() + "testFramework: " + testFramework.getName());
+                throw new IllegalArgumentException("unable to find a RockerModel for testFramework: " + testFramework.getName());
         }
     }
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy
index f35cc1ec9f..3a2cfa91fd 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/BuildBuilder.groovy
@@ -43,7 +43,7 @@ import java.util.function.Function
 class BuildBuilder implements ProjectFixture, ContextFixture {
 
     private List<String> features
-    private TestFramework testFramework
+    private DevelopmentReloading reloading
     private ApplicationType applicationType
     private JdkVersion jdkVersion
     private GormImpl gormImpl
@@ -73,8 +73,8 @@ class BuildBuilder implements ProjectFixture, ContextFixture {
         this
     }
 
-    BuildBuilder testFramework(TestFramework testFramework) {
-        this.testFramework = testFramework
+    BuildBuilder reloading(DevelopmentReloading reloading) {
+        this.reloading = reloading
         this
     }
 
@@ -105,12 +105,12 @@ class BuildBuilder implements ProjectFixture, ContextFixture {
 
     String render() {
         List<String> featureNames = this.features ?: []
-        TestFramework testFramework = this.testFramework ?: TestFramework.SPOCK
+        DevelopmentReloading reloading = this.reloading ?: DevelopmentReloading.DEVTOOLS
         ApplicationType type = this.applicationType ?: ApplicationType.WEB
         Project project = this.project ?: buildProject()
         JdkVersion jdkVersion = this.jdkVersion ?: JdkVersion.DEFAULT_OPTION
 
-        final Options options = new Options(testFramework, gormImpl, servletImpl, jdkVersion, operatingSystem)
+        final Options options = new Options(reloading, gormImpl, servletImpl, jdkVersion, operatingSystem)
         Features features = getFeatures(featureNames, options, type)
 
         GradleBuild build = gradleBuild(options, features, project, type)
@@ -123,12 +123,12 @@ class BuildBuilder implements ProjectFixture, ContextFixture {
     String renderBuildSrc() {
         List<String> featureNames = this.features ?: []
         featureNames.add("gradle-build-src")
-        TestFramework testFramework = this.testFramework ?: TestFramework.SPOCK
+        DevelopmentReloading reloading = this.reloading ?: DevelopmentReloading.DEVTOOLS
         ApplicationType type = this.applicationType ?: ApplicationType.WEB
         Project project = this.project ?: buildProject()
         JdkVersion jdkVersion = this.jdkVersion ?: JdkVersion.DEFAULT_OPTION
 
-        Options options = new Options(testFramework, jdkVersion)
+        Options options = new Options(reloading, jdkVersion)
         Features features = getFeatures(featureNames, options, type)
         String grailsVersion = VersionInfo.grailsVersion
         GradleBuild build = gradleBuild(options, features, project, type)
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleConfigurationSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleConfigurationSpec.groovy
index 28a4317396..b9ce10e368 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleConfigurationSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleConfigurationSpec.groovy
@@ -20,6 +20,7 @@
 package org.grails.forge.build.dependencies
 
 import org.grails.forge.build.gradle.GradleConfiguration
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Language
 import org.grails.forge.options.TestFramework
 import spock.lang.Specification
@@ -35,7 +36,7 @@ class GradleConfigurationSpec extends Specification {
     void "it is possible to adapt from source and phases to Gradle configuration"(Source source,
                                                                                   List<Phase> phases, GradleConfiguration configuration,
                                                                                   String description) {
-        configuration == GradleConfiguration.of(new Scope(source, phases), Language.GROOVY, TestFramework.JUNIT).get()
+        configuration == GradleConfiguration.of(new Scope(source, phases), DevelopmentReloading.DEVTOOLS).get()
 
         where:
         source           | phases                                       || configuration
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy
index 6015e8fadc..61f790a2e1 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/dependencies/GradleDependencyComparatorSpec.groovy
@@ -21,6 +21,7 @@ package org.grails.forge.build.dependencies
 
 import org.grails.forge.application.generator.GeneratorContext
 import org.grails.forge.build.gradle.GradleDependency
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.TestFramework
 import spock.lang.Specification
 
@@ -29,7 +30,7 @@ class GradleDependencyComparatorSpec extends Specification {
     void "sort based on gradle configuration"() {
         given:
         def ctx = Stub(GeneratorContext) {
-            getTestFramework() >> TestFramework.JUNIT
+            getDevelopmentReloading() >> DevelopmentReloading.DEVTOOLS
         }
         List<GradleDependency> dependencies =
                 [dep(Dependency.builder().groupId("io.micronaut").artifactId("micronaut-validation").implementation(), ctx),
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy
index fecca0fb5b..47409af06d 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/build/gradle/GradleSpec.groovy
@@ -25,6 +25,7 @@ import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
 import org.grails.forge.fixture.ContextFixture
 import org.grails.forge.fixture.ProjectFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
 import spock.lang.Specification
@@ -45,7 +46,7 @@ class GradleSpec extends Specification implements ProjectFixture, ContextFixture
 
     void "test build properties"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final String gradleProps = output["gradle.properties"]
 
         expect:
@@ -57,7 +58,7 @@ class GradleSpec extends Specification implements ProjectFixture, ContextFixture
 
     void "test build gradle"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final String buildGradle = output["build.gradle"]
 
         expect:
@@ -68,7 +69,7 @@ class GradleSpec extends Specification implements ProjectFixture, ContextFixture
 
     void "test settings.gradle"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ["gradle-settings-file"])
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ["gradle-settings-file"])
         final String settingsGradle = output["settings.gradle"]
 
         expect:
@@ -77,7 +78,7 @@ class GradleSpec extends Specification implements ProjectFixture, ContextFixture
 
     void "test buildSrc/build.gradle"() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ["gradle-build-src"])
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ["gradle-build-src"])
         String buildSrcGradle = output["buildSrc/build.gradle"]
 
         expect:
@@ -92,7 +93,7 @@ class GradleSpec extends Specification implements ProjectFixture, ContextFixture
 
     void "no settings.gradle file is created without the 'gradle-settings-file' feature"() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         String settingsGradle = output["settings.gradle"]
 
         expect:
@@ -101,7 +102,7 @@ class GradleSpec extends Specification implements ProjectFixture, ContextFixture
 
     void "no buildSrc/build.gradle file is created without the 'gradle-build-src' feature"() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         String buildSrcGradle = output["buildSrc/settings.gradle"]
 
         expect:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy
index 8172bab502..676f88319d 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/asciidoctor/AsciidoctorSpec.groovy
@@ -23,6 +23,7 @@ import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.feature.Features
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -39,7 +40,7 @@ class AsciidoctorSpec extends ApplicationContextSpec implements CommandOutputFix
 
     void "test asciidoctor gradle configurations"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ["asciidoctor"])
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ["asciidoctor"])
         final def buildGradle = output["build.gradle"]
 
         expect:
@@ -49,7 +50,7 @@ class AsciidoctorSpec extends ApplicationContextSpec implements CommandOutputFix
 
     void "test asciidoctor gradle configurations"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ["asciidoctor"])
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ["asciidoctor"])
         final def asciidocGradle = output["gradle/asciidoc.gradle"]
 
         expect:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy
index 5359b2b004..d99b13c3a8 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/assetPipeline/AssetPipelineSpec.groovy
@@ -24,6 +24,7 @@ import org.grails.forge.BuildBuilder
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.feature.Features
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -95,7 +96,7 @@ assets {
 
     void "test assets files are present"() {
         given:
-        final Map<String, String> output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final Map<String, String> output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
 
         expect:
         output.containsKey("grails-app/assets/images/advancedgrails.svg")
@@ -115,7 +116,7 @@ assets {
     @Unroll
     void "test feature asset-pipeline-grails is not supported for #applicationType application"(ApplicationType applicationType) {
         when:
-        generate(applicationType, new Options(TestFramework.SPOCK), ["asset-pipeline-grails"])
+        generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS), ["asset-pipeline-grails"])
 
         then:
         def e = thrown(IllegalArgumentException)
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy
index 2637a0061d..d24c6c7936 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/HibernateGormSpec.groovy
@@ -26,6 +26,7 @@ import org.grails.forge.application.ApplicationType
 import org.grails.forge.application.generator.GeneratorContext
 import org.grails.forge.feature.Features
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -65,7 +66,7 @@ class HibernateGormSpec extends ApplicationContextSpec implements CommandOutputF
 
     void "test buildSrc is present for buildscript dependencies"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final def buildGradle = output["build.gradle"]
 
         expect:
@@ -89,7 +90,7 @@ class HibernateGormSpec extends ApplicationContextSpec implements CommandOutputF
     void "test match values of datasource config"() {
 
         when:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final String applicationYaml = output["grails-app/conf/application.yml"]
         def config = new YamlSlurper().parseText(applicationYaml)
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy
index 6c62fcd5e0..3f52301cb8 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/TestContainersSpec.groovy
@@ -21,6 +21,7 @@ package org.grails.forge.feature.database
 
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.BuildBuilder
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.TestFramework
 
@@ -93,30 +94,15 @@ class TestContainersSpec extends ApplicationContextSpec {
         template.contains('testImplementation "org.testcontainers:testcontainers"')
     }
 
-    void "testframework dependency is present for gradle for feature #feature and spock framework"() {
+    void "reloading dependency is present for gradle for feature #feature and devtools"() {
         when:
         def template = new BuildBuilder(beanContext)
                 .features([feature])
-                .testFramework(TestFramework.SPOCK)
+                .reloading(DevelopmentReloading.DEVTOOLS)
                 .render()
 
         then:
-        template.contains('testImplementation "org.testcontainers:spock"')
-
-        where:
-        feature << ["mongo-sync", "mysql", "postgres", "sqlserver"]
-    }
-
-    void "testframework dependency is present for gradle for feature #feature and junit framework"() {
-
-        when:
-        def template = new BuildBuilder(beanContext)
-                .features([feature])
-                .testFramework(TestFramework.JUNIT)
-                .render()
-
-        then:
-        template.contains('testImplementation "org.testcontainers:junit-jupiter"')
+        template.contains('developmentOnly "org.springframework.boot:spring-boot-devtools"')
 
         where:
         feature << ["mongo-sync", "mysql", "postgres", "sqlserver"]
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/github/workflows/PlainGithubWorkflowSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/github/workflows/PlainGithubWorkflowSpec.groovy
index c9d06dda3a..d153e648c9 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/github/workflows/PlainGithubWorkflowSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/github/workflows/PlainGithubWorkflowSpec.groovy
@@ -24,6 +24,7 @@ import org.grails.forge.application.ApplicationType
 import org.grails.forge.feature.github.workflows.plain.PlainGithubWorkflowFeature
 import org.grails.forge.fixture.CommandOutputFixture
 import org.grails.forge.options.BuildTool
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -35,7 +36,7 @@ class PlainGithubWorkflowSpec extends BeanContextSpec implements CommandOutputFi
     void 'test github workflow is created for #buildTool'(BuildTool buildTool, String workflowName) {
         when:
         def output = generate(ApplicationType.WEB,
-                new Options(TestFramework.SPOCK),
+                new Options(DevelopmentReloading.DEVTOOLS),
                 [PlainGithubWorkflowFeature.NAME])
         def workflow = output[".github/workflows/${workflowName}"]
 
@@ -52,7 +53,7 @@ class PlainGithubWorkflowSpec extends BeanContextSpec implements CommandOutputFi
     void 'test github gradle workflow java version for #version'(JdkVersion version) {
         when:
         def output = generate(ApplicationType.WEB,
-                new Options(TestFramework.JUNIT, version),
+                new Options(DevelopmentReloading.DEVTOOLS, version),
                 [PlainGithubWorkflowFeature.NAME])
         def workflow = output['.github/workflows/gradle.yml']
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy
index 630568caa7..078a4ecd96 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsBaseSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.grails
 import org.grails.forge.BeanContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -32,7 +33,7 @@ class GrailsBaseSpec extends BeanContextSpec implements CommandOutputFixture {
     void "test grails base dependencies"() {
 
         when:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         def buildGradle = output['build.gradle']
 
         then:
@@ -43,7 +44,7 @@ class GrailsBaseSpec extends BeanContextSpec implements CommandOutputFixture {
 
     void "test src/main directories are present"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
 
         expect:
         output.containsKey("src/main/groovy/.gitkeep")
@@ -54,7 +55,7 @@ class GrailsBaseSpec extends BeanContextSpec implements CommandOutputFixture {
     @Unroll
     void "test domain, services and taglib directories are present for ApplicationTypes other than REST_API"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
 
@@ -69,7 +70,7 @@ class GrailsBaseSpec extends BeanContextSpec implements CommandOutputFixture {
     @Unroll
     void "test domain and services directories are present for ApplicationType.REST_API"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
 
@@ -80,4 +81,4 @@ class GrailsBaseSpec extends BeanContextSpec implements CommandOutputFixture {
         where:
         applicationType << [ApplicationType.REST_API]
     }
-}
\ No newline at end of file
+}
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy
index 7a66034046..11a5251aee 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsDefaultPluginsSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.grails
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -30,7 +31,7 @@ class GrailsDefaultPluginsSpec extends ApplicationContextSpec implements Command
 
     void "test that default grails plugins are present"() {
         given:
-        final Map<String, String> output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final Map<String, String> output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final String buildGradle = output["build.gradle"]
 
         expect:
@@ -42,7 +43,7 @@ class GrailsDefaultPluginsSpec extends ApplicationContextSpec implements Command
 
     void "test i18n message properties files are present"() {
         given:
-        final Map<String, String> output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final Map<String, String> output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
 
         expect:
         output.containsKey("grails-app/i18n/messages.properties")
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy
index a1d1d09ca1..7fff4f45b0 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grails/GrailsGradlePluginSpec.groovy
@@ -23,6 +23,7 @@ import org.grails.forge.BeanContextSpec
 import org.grails.forge.BuildBuilder
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -31,7 +32,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix
 
     void "test build gradle file and gradle properties"() {
         when:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final String gradleProps = output["gradle.properties"]
 
         then:
@@ -49,7 +50,7 @@ class GrailsGradlePluginSpec extends BeanContextSpec implements CommandOutputFix
 
     void "test buildSrc is present for buildscript dependencies"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final def buildGradle = output["build.gradle"]
 
         expect:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy
index 1a594a686f..570a3e26ff 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsProfiles/GrailsProfilesSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.grailsProfiles
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -32,7 +33,7 @@ class GrailsProfilesSpec extends ApplicationContextSpec implements CommandOutput
     @Unroll
     void "test profile dependency is present for #applicationType application"() {
         when:
-        def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("build.gradle")
@@ -45,7 +46,7 @@ class GrailsProfilesSpec extends ApplicationContextSpec implements CommandOutput
 
     void "test config"() {
         when:
-        def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("grails-app/conf/application.yml")
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsWrapper/GrailsWrapperSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsWrapper/GrailsWrapperSpec.groovy
index 744696546c..7b25403a28 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsWrapper/GrailsWrapperSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/grailsWrapper/GrailsWrapperSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.grailsWrapper
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -32,7 +33,7 @@ class GrailsWrapperSpec extends ApplicationContextSpec implements CommandOutputF
     @Unroll
     void "test grails-wrapper.jar, grailsw and grailsw.bat files are present for #applicationType application"() {
         when:
-        def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("grails-wrapper.jar")
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy
index e0f64130c1..4c00384293 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.lang
 import org.grails.forge.BeanContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Language
 import org.grails.forge.options.Options
@@ -34,7 +35,7 @@ class GrailsApplicationSpec extends BeanContextSpec implements CommandOutputFixt
     void 'Application file is generated for a #applicationType application for language: groovy'() {
         when:
         def output = generate(applicationType,
-                new Options(TestFramework.SPOCK),
+                new Options(DevelopmentReloading.DEVTOOLS),
                 [])
 
         then:
@@ -50,7 +51,7 @@ class GrailsApplicationSpec extends BeanContextSpec implements CommandOutputFixt
     void 'Application file is generated with annotation @PluginSource for #applicationType application type'() {
         when:
         def output = generate(applicationType,
-                new Options(TestFramework.SPOCK),
+                new Options(DevelopmentReloading.DEVTOOLS),
                 [])
 
         then:
@@ -106,7 +107,7 @@ class GrailsApplicationSpec extends BeanContextSpec implements CommandOutputFixt
 
     void "test build plugins"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         def buildGradle = output['build.gradle']
 
         expect:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy
index 89fc465098..3df3a2acc2 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/logging/LogbackSpec.groovy
@@ -30,7 +30,7 @@ class LogbackSpec extends ApplicationContextSpec implements CommandOutputFixture
     @Unroll
     void "test grails-logging dependency is present for #applicationType application"() {
         when:
-        def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("build.gradle")
@@ -44,7 +44,7 @@ class LogbackSpec extends ApplicationContextSpec implements CommandOutputFixture
     @Unroll
     void "test logback-spring.xml config file is present for #applicationType application"() {
         when:
-        def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("grails-app/conf/logback-spring.xml")
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/migration/DatabaseMigrationPluginSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/migration/DatabaseMigrationPluginSpec.groovy
index cfb8dfec72..b53ab1c501 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/migration/DatabaseMigrationPluginSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/migration/DatabaseMigrationPluginSpec.groovy
@@ -23,6 +23,7 @@ import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.BuildBuilder
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
 import spock.lang.Unroll
@@ -52,7 +53,7 @@ class DatabaseMigrationPluginSpec extends ApplicationContextSpec implements Comm
 
     void "test dependencies are present for buildscript "() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ['database-migration'])
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ['database-migration'])
         final def buildGradle = output["build.gradle"]
 
         expect:
@@ -63,7 +64,7 @@ class DatabaseMigrationPluginSpec extends ApplicationContextSpec implements Comm
     @Unroll
     void "test migrations directory is present"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK), ['database-migration'])
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS), ['database-migration'])
 
         then:
         output.containsKey("grails-app/migrations/.gitkeep")
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/other/ShadePluginSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/other/ShadePluginSpec.groovy
index 7b24a9dbb2..dcf3c42309 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/other/ShadePluginSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/other/ShadePluginSpec.groovy
@@ -23,6 +23,7 @@ import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.feature.Features
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
 
@@ -38,7 +39,7 @@ class ShadePluginSpec extends ApplicationContextSpec implements CommandOutputFix
 
     void "test shadow jar gradle configurations"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ["shade"])
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ["shade"])
         final def buildGradle = output["build.gradle"]
 
         expect:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy
index 4653f9eacd..ac96a74b82 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.spring
 import org.grails.forge.BeanContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -34,7 +35,7 @@ class SpringBootSpec extends BeanContextSpec implements CommandOutputFixture {
         when:
         def output = generate(
                 applicationType,
-                new Options(TestFramework.SPOCK)
+                new Options(DevelopmentReloading.DEVTOOLS)
         )
         final String build = output['build.gradle']
 
@@ -53,7 +54,7 @@ class SpringBootSpec extends BeanContextSpec implements CommandOutputFixture {
         when:
         def output = generate(
                 ApplicationType.PLUGIN,
-                new Options(TestFramework.SPOCK)
+                new Options(DevelopmentReloading.DEVTOOLS)
         )
         final String build = output['build.gradle']
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootVirtualThreadsSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootVirtualThreadsSpec.groovy
index 8adcc6f6f5..55c9a86888 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootVirtualThreadsSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringBootVirtualThreadsSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.spring
 import org.grails.forge.BeanContextSpec
 import org.grails.forge.application.generator.GeneratorContext
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -30,7 +31,7 @@ class SpringBootVirtualThreadsSpec extends BeanContextSpec implements CommandOut
 
     void "test spring boot virtual threads not enabled for JDK 17, when optional feature selected"() {
         when:
-        GeneratorContext commandContext = buildGeneratorContext(['spring-boot-virtual-threads'], new Options(TestFramework.DEFAULT_OPTION, JdkVersion.JDK_17))
+        GeneratorContext commandContext = buildGeneratorContext(['spring-boot-virtual-threads'], new Options(DevelopmentReloading.DEFAULT_OPTION, JdkVersion.JDK_17))
 
         then:
         commandContext.configuration.get('spring.threads.virtual.enabled'.toString()) == false
@@ -38,7 +39,7 @@ class SpringBootVirtualThreadsSpec extends BeanContextSpec implements CommandOut
 
     void "test spring boot virtual threads enabled for JDK 24+, when optional feature selected"() {
         when:
-        GeneratorContext commandContext = buildGeneratorContext(['spring-boot-virtual-threads'], new Options(TestFramework.DEFAULT_OPTION, JdkVersion.JDK_24))
+        GeneratorContext commandContext = buildGeneratorContext(['spring-boot-virtual-threads'], new Options(DevelopmentReloading.DEFAULT_OPTION, JdkVersion.JDK_24))
 
         then:
         commandContext.configuration.get('spring.threads.virtual.enabled'.toString()) == true
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringResourcesSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringResourcesSpec.groovy
index a530fb4f71..bd4a6cf0ce 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringResourcesSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/spring/SpringResourcesSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.spring
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -32,7 +33,7 @@ class SpringResourcesSpec extends ApplicationContextSpec implements CommandOutpu
     @Unroll
     void "test /conf/spring/resources.groovy config file is present for #applicationType application"() {
         when:
-        def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("grails-app/conf/spring/resources.groovy")
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithTestcontainersSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithTestcontainersSpec.groovy
index 1dc2d616a4..12c1f76f04 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithTestcontainersSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithTestcontainersSpec.groovy
@@ -22,6 +22,7 @@ package org.grails.forge.feature.test
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
 import spock.lang.Unroll
@@ -30,7 +31,7 @@ class GebWithTestcontainersSpec extends ApplicationContextSpec implements Comman
 
     void 'test dependencies'() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         def buildGradle = output['build.gradle']
 
         expect:
@@ -40,7 +41,7 @@ class GebWithTestcontainersSpec extends ApplicationContextSpec implements Comman
     @Unroll
     void 'test feature geb-with-testcontainers is not supported for #applicationType application'(ApplicationType applicationType) {
         when:
-        generate(applicationType, new Options(TestFramework.SPOCK), ['geb-with-testcontainers'])
+        generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS), ['geb-with-testcontainers'])
 
         then:
         def e = thrown(IllegalArgumentException)
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithWebDriverBinariesSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithWebDriverBinariesSpec.groovy
index ecc1139be4..ba6f610375 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithWebDriverBinariesSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/GebWithWebDriverBinariesSpec.groovy
@@ -23,6 +23,7 @@ import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.application.OperatingSystem
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
 import spock.lang.Unroll
@@ -31,7 +32,7 @@ class GebWithWebDriverBinariesSpec extends ApplicationContextSpec implements Com
 
     void 'test dependencies'() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ['geb-with-webdriver-binaries'])
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ['geb-with-webdriver-binaries'])
         def buildGradle = output['build.gradle']
 
         expect:
@@ -44,7 +45,7 @@ class GebWithWebDriverBinariesSpec extends ApplicationContextSpec implements Com
 
     void 'test GebConfig.groovy file is present'() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ['geb-with-webdriver-binaries'])
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ['geb-with-webdriver-binaries'])
 
         expect:
         output.containsKey('src/integration-test/resources/GebConfig.groovy')
@@ -53,7 +54,7 @@ class GebWithWebDriverBinariesSpec extends ApplicationContextSpec implements Com
     @Unroll
     void 'test feature geb is not supported for #applicationType application'(ApplicationType applicationType) {
         when:
-        generate(applicationType, new Options(TestFramework.SPOCK), ['geb-with-webdriver-binaries'])
+        generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS), ['geb-with-webdriver-binaries'])
 
         then:
         def e = thrown(IllegalArgumentException)
@@ -65,7 +66,7 @@ class GebWithWebDriverBinariesSpec extends ApplicationContextSpec implements Com
 
     void 'test webdriver binaries gradle configurations'() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK), ['geb-with-webdriver-binaries'])
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS), ['geb-with-webdriver-binaries'])
         def buildGradle = output['build.gradle']
 
         expect:
@@ -78,7 +79,7 @@ class GebWithWebDriverBinariesSpec extends ApplicationContextSpec implements Com
 
     void 'test webdriver binaries gradle configurations for windows OS'() {
         given:
-        def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK, OperatingSystem.WINDOWS), ['geb-with-webdriver-binaries'])
+        def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS, OperatingSystem.WINDOWS), ['geb-with-webdriver-binaries'])
         def buildGradle = output['build.gradle']
 
         expect:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy
deleted file mode 100644
index 677260ddd2..0000000000
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/test/JUnitSpec.groovy
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.grails.forge.feature.test
-
-import org.grails.forge.ApplicationContextSpec
-import org.grails.forge.application.ApplicationType
-import org.grails.forge.fixture.CommandOutputFixture
-import org.grails.forge.options.Options
-import org.grails.forge.options.TestFramework
-
-class JUnitSpec extends ApplicationContextSpec implements CommandOutputFixture {
-
-    void "test dependencies"() {
-
-        when:
-        Map<String, String> output = generate(ApplicationType.WEB, new Options(TestFramework.JUNIT))
-        final String buildGradle = output["build.gradle"]
-
-        then:
-        buildGradle.contains("testImplementation \"org.junit.jupiter:junit-jupiter")
-    }
-}
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy
index e0f086b119..b654cd79c0 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GrailsGspSpec.groovy
@@ -26,6 +26,7 @@ import org.grails.forge.application.ApplicationType
 import org.grails.forge.application.generator.GeneratorContext
 import org.grails.forge.feature.Features
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -91,7 +92,7 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu
 
     void "test default views are present"() {
         when:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         
         then:
         output.containsKey("grails-app/views/index.gsp")
@@ -102,7 +103,7 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu
     @Unroll
     void "test grails-gsp gradle plugins and dependencies are present for #applicationType application"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
         final String build = output['build.gradle']
 
         then:
@@ -117,7 +118,7 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu
     @Unroll
     void "test grails-plugin gradle plugins and dependencies are present for #applicationType application"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
         final String build = output['build.gradle']
 
         then:
@@ -132,7 +133,7 @@ class GrailsGspSpec extends ApplicationContextSpec implements CommandOutputFixtu
     @Unroll
     void "test grails-gsp gradle plugins and dependencies are NOT present for #applicationType application"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
         final String build = output['build.gradle']
 
         then:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy
index 3b79f66520..9c2acc5575 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewJsonSpec.groovy
@@ -25,6 +25,7 @@ import org.grails.forge.application.ApplicationType
 import org.grails.forge.application.generator.GeneratorContext
 import org.grails.forge.feature.Features
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -57,7 +58,7 @@ class ViewJsonSpec extends ApplicationContextSpec implements CommandOutputFixtur
 
     void "test default gson views are present"() {
         when:
-        final def output = generate(ApplicationType.REST_API, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.REST_API, new Options(DevelopmentReloading.DEVTOOLS))
 
         then:
         output.containsKey("grails-app/views/application/index.gson")
@@ -70,7 +71,7 @@ class ViewJsonSpec extends ApplicationContextSpec implements CommandOutputFixtur
     @Unroll
     void "test views-json gradle plugins and dependencies are present for #applicationType application"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
         final String build = output['build.gradle']
 
         then:
@@ -87,7 +88,7 @@ class ViewJsonSpec extends ApplicationContextSpec implements CommandOutputFixtur
     @Unroll
     void "test views-json gradle plugins and dependencies are NOT present for #applicationType application"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK))
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS))
         final String build = output['build.gradle']
 
         then:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy
index e51173cc11..166e86c2f9 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/json/ViewMarkupSpec.groovy
@@ -53,7 +53,7 @@ class ViewMarkupSpec extends ApplicationContextSpec implements CommandOutputFixt
 
     void "test default gml views are present"() {
         when:
-        final def output = generate(ApplicationType.REST_API, new Options(TestFramework.SPOCK), ["views-markup"])
+        final def output = generate(ApplicationType.REST_API, new Options(DevelopmentReloading.DEVTOOLS), ["views-markup"])
 
         then:
         output.containsKey("grails-app/views/application/index.gml")
@@ -66,7 +66,7 @@ class ViewMarkupSpec extends ApplicationContextSpec implements CommandOutputFixt
     @Unroll
     void "test views-markup gradle plugins and dependencies are present for #applicationType application"() {
         when:
-        final def output = generate(applicationType, new Options(TestFramework.SPOCK), ["views-markup"])
+        final def output = generate(applicationType, new Options(DevelopmentReloading.DEVTOOLS), ["views-markup"])
         final String build = output['build.gradle']
 
         then:
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy
index 4b3591d74c..ac506a34b3 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/web/GrailsWebSpec.groovy
@@ -23,6 +23,7 @@ import groovy.yaml.YamlSlurper
 import org.grails.forge.ApplicationContextSpec
 import org.grails.forge.application.ApplicationType
 import org.grails.forge.fixture.CommandOutputFixture
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -31,7 +32,7 @@ class GrailsWebSpec extends ApplicationContextSpec implements CommandOutputFixtu
 
     void "test grails-web feature"() {
         given:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final def buildGradle = output["build.gradle"]
 
         expect:
@@ -40,7 +41,7 @@ class GrailsWebSpec extends ApplicationContextSpec implements CommandOutputFixtu
 
     void "test grails-web configuration"() {
         when:
-        final def output = generate(ApplicationType.WEB, new Options(TestFramework.SPOCK))
+        final def output = generate(ApplicationType.WEB, new Options(DevelopmentReloading.DEVTOOLS))
         final String applicationYaml = output["grails-app/conf/application.yml"]
         def config = new YamlSlurper().parseText(applicationYaml)
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/fixture/ContextFixture.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/fixture/ContextFixture.groovy
index 9936b1c6d4..41fb5ebb03 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/fixture/ContextFixture.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/fixture/ContextFixture.groovy
@@ -32,6 +32,7 @@ import org.grails.forge.feature.FeatureContext
 import org.grails.forge.feature.Features
 import org.grails.forge.feature.validation.FeatureValidator
 import org.grails.forge.io.ConsoleOutput
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Language
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -54,7 +55,7 @@ trait ContextFixture {
 
     Features getFeatures(List<String> features,
                          ApplicationType applicationType = ApplicationType.WEB) {
-        Options options = new Options(TestFramework.DEFAULT_OPTION)
+        Options options = new Options(DevelopmentReloading.DEFAULT_OPTION)
         return getFeatures(features, options, applicationType)
     }
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestFrameworkSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestFrameworkSpec.groovy
index d93853b2bb..0043cee38d 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestFrameworkSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestFrameworkSpec.groovy
@@ -24,18 +24,16 @@ import spock.lang.Unroll
 
 class TestFrameworkSpec extends Specification {
 
-    @Unroll("expected test source path: #expected for path: #path , lang: #lang and test framework: #testFramework")
-    void "getSourcePath returns a path with the correct language extension and test framework suffix"(Language lang,
-                                                                                                      TestFramework testFramework,
+    @Unroll("expected test source path: #expected for path: #path and test framework: #testFramework")
+    void "getSourcePath returns a path with the correct language extension and test framework suffix"(TestFramework testFramework,
                                                                                                       String expected,
                                                                                                       String path) {
         expect:
-        expected == testFramework.getSourcePath(path, lang)
+        expected == testFramework.getSourcePath(path)
 
         where:
-        lang            | testFramework       || expected
-        Language.GROOVY | TestFramework.JUNIT || "src/test/groovy/{packagePath}/{className}Test.groovy"
-        Language.GROOVY | TestFramework.SPOCK || "src/test/groovy/{packagePath}/{className}Spec.groovy"
+        testFramework = TestFramework.SPOCK
+        expected = "src/test/groovy/{packagePath}/{className}Spec.groovy"
         path = '/{packagePath}/{className}'
     }
 
@@ -58,7 +56,6 @@ class TestFrameworkSpec extends Specification {
 
         where:
         expected          | testFramework
-        [Language.GROOVY] | TestFramework.JUNIT
         [Language.GROOVY] | TestFramework.SPOCK
     }
 }
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestRockerModelProviderSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestRockerModelProviderSpec.groovy
index 0df59cb7f0..5016309681 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestRockerModelProviderSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/TestRockerModelProviderSpec.groovy
@@ -26,8 +26,7 @@ import spock.lang.Unroll
 class TestRockerModelProviderSpec extends Specification {
 
     @Unroll
-    void "a delegate method is defined for language: #language and test framework: #testFramework "(Language language,
-                                                                                                    TestFramework testFramework) {
+    void "a delegate method is defined for test framework: #testFramework "(TestFramework testFramework) {
         given:
         TestRockerModelProvider provider = new TestRockerModelProvider() {
 
@@ -35,21 +34,16 @@ class TestRockerModelProviderSpec extends Specification {
             RockerModel spock() {
                 return null
             }
-
-            @Override
-            RockerModel groovyJunit() {
-                return null
-            }
         }
 
         when:
-        provider.findModel(language, testFramework)
+        provider.findModel(testFramework)
 
         then:
         noExceptionThrown()
 
         where:
-        [language, testFramework] << [Language.values(), TestFramework.values()].combinations()
+        testFramework << TestFramework.values()
     }
 }
 
diff --git a/grails-forge/test-core/src/test/groovy/org/grails/forge/utils/CommandSpec.groovy b/grails-forge/test-core/src/test/groovy/org/grails/forge/utils/CommandSpec.groovy
index 6560c6688d..4850b4535c 100644
--- a/grails-forge/test-core/src/test/groovy/org/grails/forge/utils/CommandSpec.groovy
+++ b/grails-forge/test-core/src/test/groovy/org/grails/forge/utils/CommandSpec.groovy
@@ -27,6 +27,7 @@ import org.grails.forge.io.ConsoleOutput
 import org.grails.forge.io.FileSystemOutputHandler
 import org.grails.forge.io.OutputHandler
 import org.grails.forge.options.BuildTool
+import org.grails.forge.options.DevelopmentReloading
 import org.grails.forge.options.Language
 import org.grails.forge.options.Options
 import org.grails.forge.options.TestFramework
@@ -87,10 +88,10 @@ abstract class CommandSpec extends Specification {
     void generateProject(OperatingSystem operatingSystem = OperatingSystem.LINUX,
                          List<String> features = [],
                          ApplicationType applicationType = ApplicationType.WEB,
-                         TestFramework testFramework = TestFramework.DEFAULT_OPTION) {
+                         DevelopmentReloading reloading = DevelopmentReloading.DEFAULT_OPTION) {
         applicationContext.getBean(ProjectGenerator).generate(applicationType,
                 NameUtils.parse("example.grails.foo"),
-                new Options(testFramework),
+                new Options(reloading),
                 operatingSystem,
                 features,
                 new FileSystemOutputHandler(dir, ConsoleOutput.NOOP),
@@ -102,7 +103,7 @@ abstract class CommandSpec extends Specification {
             List<String> features = []) {
         applicationContext.getBean(ProjectGenerator).generate(applicationType,
                 NameUtils.parse("example.grails.foo"),
-                new Options(TestFramework.DEFAULT_OPTION),
+                new Options(DevelopmentReloading.DEFAULT_OPTION),
                 OperatingSystem.DEFAULT_OPTION,
                 features,
                 new FileSystemOutputHandler(dir, ConsoleOutput.NOOP),
diff --git a/grails-test-examples/geb/grails-cli.yml b/grails-test-examples/geb/grails-cli.yml
index 6c12b5fcbc..499280e8a1 100644
--- a/grails-test-examples/geb/grails-cli.yml
+++ b/grails-test-examples/geb/grails-cli.yml
@@ -15,7 +15,7 @@
 
 applicationType: web
 defaultPackage: org.demo.spock
-testFramework: spock
+reloading: devtools
 sourceLanguage: groovy
 buildTool: gradle
 gormImpl: gorm-hibernate5
diff --git a/grails-test-examples/gsp-layout/grails-forge-cli.yml b/grails-test-examples/gsp-layout/grails-forge-cli.yml
index ec46d6bb74..1b381bd2d7 100644
--- a/grails-test-examples/gsp-layout/grails-forge-cli.yml
+++ b/grails-test-examples/gsp-layout/grails-forge-cli.yml
@@ -15,7 +15,7 @@
 
 applicationType: web_plugin
 defaultPackage: org.example.grails.layout
-testFramework: spock
+reloading: devtools
 sourceLanguage: groovy
 buildTool: gradle
 gormImpl: gorm-hibernate5
diff --git a/grails-test-examples/gsp-sitemesh3/grails-forge-cli.yml b/grails-test-examples/gsp-sitemesh3/grails-forge-cli.yml
index ec46d6bb74..1b381bd2d7 100644
--- a/grails-test-examples/gsp-sitemesh3/grails-forge-cli.yml
+++ b/grails-test-examples/gsp-sitemesh3/grails-forge-cli.yml
@@ -15,7 +15,7 @@
 
 applicationType: web_plugin
 defaultPackage: org.example.grails.layout
-testFramework: spock
+reloading: devtools
 sourceLanguage: groovy
 buildTool: gradle
 gormImpl: gorm-hibernate5