From 374e8dbc777f0a70a1442f56401dc462689ab19c Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Mon, 10 May 2021 16:38:01 +0300 Subject: [PATCH 1/8] vie resolvert lesson init --- 3-0-spring-framework/3-0-2-view-resolver/pom.xml | 14 ++++++++++++++ .../src/main/webapp/WEB-INF/views/index.jsp | 5 +++++ 3-0-spring-framework/pom.xml | 1 + 3 files changed, 20 insertions(+) create mode 100644 3-0-spring-framework/3-0-2-view-resolver/pom.xml create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/index.jsp diff --git a/3-0-spring-framework/3-0-2-view-resolver/pom.xml b/3-0-spring-framework/3-0-2-view-resolver/pom.xml new file mode 100644 index 0000000..250a762 --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/pom.xml @@ -0,0 +1,14 @@ + + + + 3-0-spring-framework + com.bobocode + 1.0-SNAPSHOT + + 4.0.0 + + 3-0-2-view-resolver + + \ No newline at end of file diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/index.jsp b/3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/index.jsp new file mode 100644 index 0000000..c38169b --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/3-0-spring-framework/pom.xml b/3-0-spring-framework/pom.xml index f018246..c151244 100644 --- a/3-0-spring-framework/pom.xml +++ b/3-0-spring-framework/pom.xml @@ -16,6 +16,7 @@ 3-0-0-hello-spring-framework 3-0-1-hello-spring-mvc 3-1-1-dispatcher-servlet-initializer + 3-0-2-view-resolver \ No newline at end of file From 5a5e49900845c33f2e5b322c2ac240f569258773 Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Mon, 10 May 2021 16:53:30 +0300 Subject: [PATCH 2/8] add temporal tests need refactor --- .../3-0-2-view-resolver/pom.xml | 41 +++++++++ .../viewresolver/ViewResolverApp.java | 6 ++ .../config/DispatcherServletConfig.java | 20 +++++ .../viewresolver/config/ResolverConfig.java | 4 + .../viewresolver/ViewResolverTest.java | 86 +++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java diff --git a/3-0-spring-framework/3-0-2-view-resolver/pom.xml b/3-0-spring-framework/3-0-2-view-resolver/pom.xml index 250a762..16f5537 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/pom.xml +++ b/3-0-spring-framework/3-0-2-view-resolver/pom.xml @@ -10,5 +10,46 @@ 4.0.0 3-0-2-view-resolver + war + + UTF-8 + 11 + 11 + + + + + org.springframework + spring-webmvc + 5.3.6 + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + + + org.springframework.boot + spring-boot-starter-test + 2.4.5 + test + + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.0 + + + \ No newline at end of file diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java new file mode 100644 index 0000000..8a3dc2b --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java @@ -0,0 +1,6 @@ +package com.bobocode.viewresolver; + +public class ViewResolverApp { + public static void main(String[] args) { + } +} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java new file mode 100644 index 0000000..3a36ef2 --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java @@ -0,0 +1,20 @@ +package com.bobocode.viewresolver.config; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class DispatcherServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { + @Override + protected Class[] getRootConfigClasses() { + return new Class[0]; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[]{ResolverConfig.class}; + } + + @Override + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java new file mode 100644 index 0000000..fd141dc --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java @@ -0,0 +1,4 @@ +package com.bobocode.viewresolver.config; + +public class ResolverConfig { +} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java new file mode 100644 index 0000000..1095ad3 --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java @@ -0,0 +1,86 @@ +package com.bobocode.viewresolver; + +import com.bobocode.viewresolver.config.ResolverConfig; +import lombok.SneakyThrows; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.lang.reflect.Method; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +@ContextConfiguration(classes = {ResolverConfig.class}) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ViewResolverTest { + @Autowired + private MockMvc mockMvc; + + @Test + @Order(1) + @DisplayName("Class is marked as @Configuration") + void classIsMarkedAsConfiguration() { + Configuration configuration = ResolverConfig.class.getAnnotation(Configuration.class); + assertNotNull(configuration); + } + + @Test + @Order(2) + @DisplayName("Configuration Class marked as @EnableWebMvc") + void classAnnotatedWithEnableWebMvc() { + EnableWebMvc enableWebMvc = ResolverConfig.class.getAnnotation(EnableWebMvc.class); + assertNotNull(enableWebMvc); + } + + @Test + @Order(3) + @DisplayName("Configuration Class marked as @ComponentScan") + void classAnnotatedWithComponentScan() { + ComponentScan componentScan = ResolverConfig.class.getAnnotation(ComponentScan.class); + assertNotNull(componentScan); + } + + @Test + @Order(4) + @DisplayName("ComponentScan packages are indicated") + void ComponentScanHasIndicatedPackages() { + ComponentScan componentScan = ResolverConfig.class.getAnnotation(ComponentScan.class); + assertEquals("com.bobocode.resolver", componentScan.basePackages()[0]); + } + + @Test + @Order(5) + @DisplayName("Is config class implements WebMvcConfigurer interface") + void isConfigClassImplementsWebMvcConfigurerInterface() { + assertTrue(WebMvcConfigurer.class.isAssignableFrom(ResolverConfig.class)); + } + + @SneakyThrows + @Test + @Order(6) + @DisplayName("Is config class overrides configureViewResolvers method") + void isConfigurationClassContainsViewResolverMethod() { + Method configureViewResolvers = ResolverConfig.class.getMethod("configureViewResolvers", ViewResolverRegistry.class); + assertNotNull(configureViewResolvers); + } + + @Test + @Order(7) + @SneakyThrows + void getRequestReturnOkStatus() { + mockMvc.perform(get("/")) + .andExpect(status().isOk()); + } +} From 3870efbea3d13cff4a928a163d97117b3c48ab85 Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Mon, 10 May 2021 17:04:06 +0300 Subject: [PATCH 3/8] Add tests to exercise --- .../viewresolver/ViewResolverTest.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java index 1095ad3..c9dd3fd 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java @@ -9,7 +9,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; @@ -18,13 +17,15 @@ import java.lang.reflect.Method; import static org.junit.jupiter.api.Assertions.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; @WebMvcTest @ContextConfiguration(classes = {ResolverConfig.class}) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class ViewResolverTest { + @Autowired private MockMvc mockMvc; @@ -38,7 +39,7 @@ void classIsMarkedAsConfiguration() { @Test @Order(2) - @DisplayName("Configuration Class marked as @EnableWebMvc") + @DisplayName("Configuration Class has annotation @EnableWebMvc") void classAnnotatedWithEnableWebMvc() { EnableWebMvc enableWebMvc = ResolverConfig.class.getAnnotation(EnableWebMvc.class); assertNotNull(enableWebMvc); @@ -46,7 +47,7 @@ void classAnnotatedWithEnableWebMvc() { @Test @Order(3) - @DisplayName("Configuration Class marked as @ComponentScan") + @DisplayName("Configuration Class has annotation @ComponentScan") void classAnnotatedWithComponentScan() { ComponentScan componentScan = ResolverConfig.class.getAnnotation(ComponentScan.class); assertNotNull(componentScan); @@ -62,7 +63,7 @@ void ComponentScanHasIndicatedPackages() { @Test @Order(5) - @DisplayName("Is config class implements WebMvcConfigurer interface") + @DisplayName("Config class implements WebMvcConfigurer interface") void isConfigClassImplementsWebMvcConfigurerInterface() { assertTrue(WebMvcConfigurer.class.isAssignableFrom(ResolverConfig.class)); } @@ -70,7 +71,7 @@ void isConfigClassImplementsWebMvcConfigurerInterface() { @SneakyThrows @Test @Order(6) - @DisplayName("Is config class overrides configureViewResolvers method") + @DisplayName("Config class overrides configureViewResolvers method") void isConfigurationClassContainsViewResolverMethod() { Method configureViewResolvers = ResolverConfig.class.getMethod("configureViewResolvers", ViewResolverRegistry.class); assertNotNull(configureViewResolvers); @@ -79,8 +80,11 @@ void isConfigurationClassContainsViewResolverMethod() { @Test @Order(7) @SneakyThrows - void getRequestReturnOkStatus() { + @DisplayName("Get request returns correct view name and URL") + void getRequestReturnCorrectUrlAndViewName() { mockMvc.perform(get("/")) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andExpect(view().name("index")) + .andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/views/index.jsp")); } } From 98b7dd8283f788bda328430ad6642ff0031bbaf3 Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Mon, 10 May 2021 17:25:29 +0300 Subject: [PATCH 4/8] refactor packges --- .../java/com/bobocode/{viewresolver => }/ViewResolverApp.java | 2 +- .../{viewresolver => }/config/DispatcherServletConfig.java | 2 +- .../src/main/java/com/bobocode/config/ResolverConfig.java | 4 ++++ .../java/com/bobocode/viewresolver/config/ResolverConfig.java | 4 ---- .../com/bobocode/{viewresolver => }/ViewResolverTest.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/{viewresolver => }/ViewResolverApp.java (70%) rename 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/{viewresolver => }/config/DispatcherServletConfig.java (92%) create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java delete mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java rename 3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/{viewresolver => }/ViewResolverTest.java (97%) diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/ViewResolverApp.java similarity index 70% rename from 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java rename to 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/ViewResolverApp.java index 8a3dc2b..9733671 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/ViewResolverApp.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/ViewResolverApp.java @@ -1,4 +1,4 @@ -package com.bobocode.viewresolver; +package com.bobocode; public class ViewResolverApp { public static void main(String[] args) { diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/DispatcherServletConfig.java similarity index 92% rename from 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java rename to 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/DispatcherServletConfig.java index 3a36ef2..e20b5cc 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/DispatcherServletConfig.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/DispatcherServletConfig.java @@ -1,4 +1,4 @@ -package com.bobocode.viewresolver.config; +package com.bobocode.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java new file mode 100644 index 0000000..40bb352 --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java @@ -0,0 +1,4 @@ +package com.bobocode.config; + +public class ResolverConfig { +} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java deleted file mode 100644 index fd141dc..0000000 --- a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/viewresolver/config/ResolverConfig.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bobocode.viewresolver.config; - -public class ResolverConfig { -} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java similarity index 97% rename from 3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java rename to 3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java index c9dd3fd..ba3b2ff 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/viewresolver/ViewResolverTest.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java @@ -1,6 +1,6 @@ -package com.bobocode.viewresolver; +package com.bobocode; -import com.bobocode.viewresolver.config.ResolverConfig; +import com.bobocode.config.ResolverConfig; import lombok.SneakyThrows; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; From e60b3e9ed513f1fe64eab97089fa2f2944df29bf Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Sat, 15 May 2021 22:39:29 +0300 Subject: [PATCH 5/8] add HelloJspController tests and refactor viewResolverRegistryHasCorrectPrefixAndSuffix() method --- .../controller/HelloJspController.java | 14 +++ .../com/bobocode/HelloJspControllerTest.java | 88 +++++++++++++++++++ .../java/com/bobocode/ViewResolverTest.java | 19 ++-- 3 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java create mode 100644 3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java new file mode 100644 index 0000000..4f3f157 --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java @@ -0,0 +1,14 @@ +package com.bobocode.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping +public class HelloJspController { + @GetMapping + public String hello() { + return "hello"; + } +} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java new file mode 100644 index 0000000..e190780 --- /dev/null +++ b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java @@ -0,0 +1,88 @@ +package com.bobocode; + +import com.bobocode.config.ResolverConfig; +import com.bobocode.controller.HelloJspController; +import lombok.SneakyThrows; +import org.junit.jupiter.api.*; +import org.mockito.internal.configuration.ClassPathLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.validation.support.BindingAwareModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.lang.reflect.Method; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest +@ContextConfiguration(classes = ResolverConfig.class) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class HelloJspControllerTest { + + @Autowired + private MockMvc mockMvc; + private final HelloJspController helloJspController = new HelloJspController(); + + @Test + @Order(1) + @DisplayName("Class marked as @Controller") + void helloJspControllerClassMarkedAsController() { + Controller controller = HelloJspController.class.getAnnotation(Controller.class); + assertNotNull(controller); + } + + @Test + @Order(2) + @DisplayName("Class marked as @RequestMapping") + void helloJspControllerClassMarkedAsRequestMapping() { + RequestMapping requestMapping = HelloJspController.class.getAnnotation(RequestMapping.class); + assertNotNull(requestMapping); + } + + @Test + @Order(3) + @DisplayName("Method that get hello page is marker with @GetMapping") + void helloJspControllerHasMethodAnnotatedAsGetMapping() { + boolean hasAnnotation = Arrays.stream(HelloJspController.class.getMethods()) + .anyMatch(method -> + method.getAnnotation(GetMapping.class) != null + ); + assertTrue(hasAnnotation); + } + + @Test + @Order(4) + @SneakyThrows + @DisplayName("Get method returns view name \"hello\"") + void helloJspControllerMethodReturnsHelloViewName() { + Method method = Arrays.stream(HelloJspController.class.getMethods()) + .filter(m -> m.getAnnotation(GetMapping.class) != null) + .findFirst() + .orElseThrow(); + + var viewName = method.invoke(helloJspController); + + assertEquals("hello", viewName); + } + + @Test + @Order(5) + @SneakyThrows + @DisplayName("GET method is completed ✅") + void getRequestShouldReturnStatusOkAndCorrectData() { + mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andExpect(view().name("hello")) + .andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/views/hello.jsp")); + } +} diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java index ba3b2ff..d736700 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/ViewResolverTest.java @@ -3,6 +3,7 @@ import com.bobocode.config.ResolverConfig; import lombok.SneakyThrows; import org.junit.jupiter.api.*; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.context.annotation.ComponentScan; @@ -21,13 +22,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; -@WebMvcTest -@ContextConfiguration(classes = {ResolverConfig.class}) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class ViewResolverTest { - @Autowired - private MockMvc mockMvc; + private final ResolverConfig config = new ResolverConfig(); + private final ViewResolverRegistry resolverRegistry = Mockito.mock(ViewResolverRegistry.class); @Test @Order(1) @@ -58,7 +57,7 @@ void classAnnotatedWithComponentScan() { @DisplayName("ComponentScan packages are indicated") void ComponentScanHasIndicatedPackages() { ComponentScan componentScan = ResolverConfig.class.getAnnotation(ComponentScan.class); - assertEquals("com.bobocode.resolver", componentScan.basePackages()[0]); + assertEquals("com.bobocode", componentScan.basePackages()[0]); } @Test @@ -80,11 +79,9 @@ void isConfigurationClassContainsViewResolverMethod() { @Test @Order(7) @SneakyThrows - @DisplayName("Get request returns correct view name and URL") - void getRequestReturnCorrectUrlAndViewName() { - mockMvc.perform(get("/")) - .andExpect(status().isOk()) - .andExpect(view().name("index")) - .andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/views/index.jsp")); + @DisplayName("View resolver registry has correct prefix and suffix") + void viewResolverRegistryHasCorrectPrefixAndSuffix() { + config.getClass().getMethod("configureViewResolvers", ViewResolverRegistry.class).invoke(config, resolverRegistry); + Mockito.verify(resolverRegistry).jsp("/WEB-INF/views/", ".jsp"); } } From 8b3bb9aebde2193f2ed7a72283febef5645a9fdc Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Sat, 15 May 2021 22:42:50 +0300 Subject: [PATCH 6/8] HelloJspController refactor --- .../com/bobocode/controller/HelloJspController.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java index 4f3f157..50cdd00 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java @@ -1,14 +1,4 @@ package com.bobocode.controller; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -@RequestMapping public class HelloJspController { - @GetMapping - public String hello() { - return "hello"; - } } From fd000a7ad59830dafd0d90632350304f74f363a0 Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Mon, 10 May 2021 17:23:47 +0300 Subject: [PATCH 7/8] implementing exercise in completed branch --- .../java/com/bobocode/config/ResolverConfig.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java index 40bb352..39ef7ef 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/config/ResolverConfig.java @@ -1,4 +1,17 @@ package com.bobocode.config; -public class ResolverConfig { +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = "com.bobocode") +public class ResolverConfig implements WebMvcConfigurer { + @Override + public void configureViewResolvers(ViewResolverRegistry registry) { + registry.jsp("/WEB-INF/views/", ".jsp"); + } } From dfb70009adac515f84e25507369b0b10a47460d6 Mon Sep 17 00:00:00 2001 From: Ivan Virchenko Date: Sat, 15 May 2021 23:30:59 +0300 Subject: [PATCH 8/8] G-55 ViewResolver exercize Completed commit --- .../com/bobocode/controller/HelloJspController.java | 10 ++++++++++ .../main/webapp/WEB-INF/views/{index.jsp => hello.jsp} | 0 .../test/java/com/bobocode/HelloJspControllerTest.java | 7 ++----- 3 files changed, 12 insertions(+), 5 deletions(-) rename 3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/{index.jsp => hello.jsp} (100%) diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java index 50cdd00..4f3f157 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/main/java/com/bobocode/controller/HelloJspController.java @@ -1,4 +1,14 @@ package com.bobocode.controller; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping public class HelloJspController { + @GetMapping + public String hello() { + return "hello"; + } } diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/index.jsp b/3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/hello.jsp similarity index 100% rename from 3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/index.jsp rename to 3-0-spring-framework/3-0-2-view-resolver/src/main/webapp/WEB-INF/views/hello.jsp diff --git a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java index e190780..425dc81 100644 --- a/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java +++ b/3-0-spring-framework/3-0-2-view-resolver/src/test/java/com/bobocode/HelloJspControllerTest.java @@ -4,15 +4,12 @@ import com.bobocode.controller.HelloJspController; import lombok.SneakyThrows; import org.junit.jupiter.api.*; -import org.mockito.internal.configuration.ClassPathLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -import org.springframework.validation.support.BindingAwareModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,9 +17,9 @@ import java.util.Arrays; import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; @WebMvcTest @ContextConfiguration(classes = ResolverConfig.class)