diff --git a/testing-modules/junit-5-advanced-3/pom.xml b/testing-modules/junit-5-advanced-3/pom.xml
new file mode 100644
index 000000000000..f54df8f28766
--- /dev/null
+++ b/testing-modules/junit-5-advanced-3/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+ junit-5-advanced-3
+ 1.0-SNAPSHOT
+ junit-5-advanced-3
+ Advanced JUnit 5 Topics
+
+
+ com.baeldung
+ testing-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-launcher
+ ${junit-platform-launcher.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+
+
+
+ 5.13.4
+ 1.13.4
+ 3.5.3
+
+
+
+
diff --git a/testing-modules/junit-5-advanced-3/src/main/java/com/baeldung/classtemplate/Greeter.java b/testing-modules/junit-5-advanced-3/src/main/java/com/baeldung/classtemplate/Greeter.java
new file mode 100644
index 000000000000..3763e1dd949a
--- /dev/null
+++ b/testing-modules/junit-5-advanced-3/src/main/java/com/baeldung/classtemplate/Greeter.java
@@ -0,0 +1,9 @@
+package com.baeldung.classtemplate;
+
+public class Greeter {
+
+ public String greet(String name, String language) {
+ return "it".equals(language) ? "Ciao " + name : "Hello " + name;
+ }
+}
+
diff --git a/testing-modules/junit-5-advanced-3/src/test/java/com/baeldung/classtemplate/GreeterClassTemplateInvocationContextProvider.java b/testing-modules/junit-5-advanced-3/src/test/java/com/baeldung/classtemplate/GreeterClassTemplateInvocationContextProvider.java
new file mode 100644
index 000000000000..f5cc9d94e790
--- /dev/null
+++ b/testing-modules/junit-5-advanced-3/src/test/java/com/baeldung/classtemplate/GreeterClassTemplateInvocationContextProvider.java
@@ -0,0 +1,57 @@
+package com.baeldung.classtemplate;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.ClassTemplate;
+import org.junit.jupiter.api.extension.ClassTemplateInvocationContext;
+import org.junit.jupiter.api.extension.ClassTemplateInvocationContextProvider;
+import org.junit.jupiter.api.extension.Extension;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ParameterContext;
+import org.junit.jupiter.api.extension.ParameterResolver;
+
+public class GreeterClassTemplateInvocationContextProvider
+ implements ClassTemplateInvocationContextProvider {
+
+ @Override
+ public boolean supportsClassTemplate(ExtensionContext context) {
+ return context.getTestClass()
+ .map(c -> c.isAnnotationPresent(ClassTemplate.class))
+ .orElse(false);
+ }
+
+ @Override
+ public Stream provideClassTemplateInvocationContexts(
+ ExtensionContext context) {
+
+ return Stream.of(contextFor("en"), contextFor("it"));
+ }
+
+ private ClassTemplateInvocationContext contextFor(String language) {
+ ParameterResolver resolver = new ParameterResolver() {
+ @Override
+ public boolean supportsParameter(ParameterContext pc, ExtensionContext ec) {
+ return pc.getParameter().getType() == String.class;
+ }
+
+ @Override
+ public Object resolveParameter(ParameterContext pc, ExtensionContext ec) {
+ return language;
+ }
+ };
+
+ return new ClassTemplateInvocationContext() {
+ @Override
+ public String getDisplayName(int invocationIndex) {
+ return "Language-" + language;
+ }
+
+ @Override
+ public List getAdditionalExtensions() {
+ return List.of(resolver);
+ }
+ };
+ }
+}
+
diff --git a/testing-modules/junit-5-advanced-3/src/test/java/com/baeldung/classtemplate/GreeterClassTemplateUnitTest.java b/testing-modules/junit-5-advanced-3/src/test/java/com/baeldung/classtemplate/GreeterClassTemplateUnitTest.java
new file mode 100644
index 000000000000..db9512829446
--- /dev/null
+++ b/testing-modules/junit-5-advanced-3/src/test/java/com/baeldung/classtemplate/GreeterClassTemplateUnitTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.classtemplate;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import static java.lang.System.Logger;
+import static java.lang.System.Logger.Level;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.ClassTemplate;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+@ClassTemplate
+@ExtendWith(GreeterClassTemplateInvocationContextProvider.class)
+class GreeterClassTemplateUnitTest {
+
+ private static final Logger LOG =
+ System.getLogger("GreeterClassTemplateUnitTest");
+
+ private final String language;
+
+ GreeterClassTemplateUnitTest(String language) {
+ this.language = language;
+ }
+
+ @BeforeEach
+ void logContext() {
+ LOG.log(Level.INFO, () -> ">> Context: Language-" + language);
+ }
+
+ @Test
+ void whenGreet_thenLocalizedMessage() {
+
+ Greeter greeter = new Greeter();
+ String actual = greeter.greet("Baeldung", language);
+
+ assertEquals(
+ "it".equals(language) ? "Ciao Baeldung" : "Hello Baeldung",
+ actual
+ );
+ }
+}
+