spring framework

스프링 프레임워크 #7 - 부트 스트랩 - 메이븐 설정, 단위테스트, 통합테스트

letsDoDev 2023. 9. 21. 05:07

◎ 참고 서적  |  Mastering Spring 5 

 

[ 스프링 MVC +부트 스트랩 설정]

1. 메이븐을 이용하여 부트 스트랩 WebJar 추가

위치 : pom.xml

		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>bootstrap</artifactId>
			<version>3.3.6</version>
		</dependency>

2. WebJar 정적 콘텐츠 제공을 위한 MVC 리소스 핸들로 구성

위치 : context.xml

<mvc:resources mapping="/webjars/**" location="/webjars/" />

3. 부트 스트랩 사용할 jsp 파일의 스크립트 영역에 아래 스크립트 영역 추가

<script src="webjars/bootstrap/3.3.6/js/bootstrap.min.js">
</script>

<link
   href="webjars/bootstrap/3.3.6/css/bootstrap.min.css"
   rel="stylesheet">

<<테스트 하기 위한 pom.xml>>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mastering.spring</groupId>
	<artifactId>mastering-spring-chapter3-springmvc</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>
		<spring.version>5.1.3.RELEASE</spring.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-framework-bom</artifactId>
				<version>${spring.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!-- 별도 추가임  -->
		<dependency>
		    <groupId>javax.xml.bind</groupId>
		     <artifactId>jaxb-api</artifactId>
		    <version>2.3.0</version>
		</dependency>
		
		<!-- chapter 3  플로우 6 추가 파트 -> 유효성 검사 하이버네이트 밸리데이터  -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.0.2.Final</version>
		</dependency>
	
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>5.1.2.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>5.1.2.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.0.2.Final</version>
		</dependency>
	
		<!-- 부트 스트랩 사용을 위한  -->
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>bootstrap</artifactId>
			<version>3.3.6</version>
		</dependency>

		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>jquery</artifactId>
			<version>1.9.1</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.0.pr3</version>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

		<!-- Unit Test Dependencies 단위테스트 위해서 추가해야할 의존관계-->	
		<!-- 단위 테스트 중 MockMvc 클래스와 @Before 어노테이션 사용하기 위해 내가 별도로 추가한 코드  -->

		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter</artifactId>
		    <version>2.5.4</version>
		</dependency>
				
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-test</artifactId>
		    <version>2.5.4</version>
		    <!-- <scope>test</scope> -->
		</dependency>

	 	<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<!-- <scope>test</scope> jnit어노테이션 import 안되어서 주석처리하니깐
			해결됨-->
		</dependency>
		
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-test</artifactId>
		  <!-- <scope>test</scope> -->
		</dependency>
		
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<!-- <scope>test</scope> -->
		</dependency>
		
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-core</artifactId>
			<version>1.9.0-rc1</version>
			<!-- <scope>test</scope> -->
		</dependency>
	</dependencies>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.2</version>
					<configuration>
						<verbose>true</verbose>
						<source>1.8</source>
						<target>1.8</target>
						<showWarnings>true</showWarnings>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.tomcat.maven</groupId>
					<artifactId>tomcat7-maven-plugin</artifactId>
					<version>2.2</version>
					<configuration>
						<path>/</path>
						<contextReloadable>true</contextReloadable>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</pluginRepository>
		<pluginRepository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>
</project>

 

[단위 테스트]

특정 컨트롤러만 테스트 하는 것

https://letsdodev.tistory.com/6 에서 실습한 에제의  MVC 모델을 사용하여 테스트한다.

 

컨트롤러 단위 테스트를 위해 사용돠눈 프레임워크 :  Mock 프레임워크

사용하기 위해 아래 의존 관계를 추가한다 -> pom.xml

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<scope>test</scope>
		</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.1.0.RELEASE</version> <!-- 스프링 부트 버전에 따라 버전을 조정 -->
            <scope>test</scope>
		</dependency>

 

- BasicController 에 대한 Test 컨트롤러

package com.mastering.spring.springmvc.controller;

public class BasicControllerTest {

	
	private MockMvc mockMvc;
	
	@Before
	public void setup() {
		this.mockMvc = MockMvcBuilders.standaloneSetup(new BasicController()).builder();
	}
	
	@Test
	public void basicTest() throws Exception {
		this.mockMvc
		.perform(
				 get("/welcome")
				
		.accept(MedialType.parseMediaType("application/html;charset=UTF-8")))		
		.andExpect(status().isOk())
		.andExpect(content().contentType("application/html;charset=UTF-8"))
		.andExpect(content().string("Welcome to Spring MVC"));
	}
	
	
	/*
	 * MockMvc mockMvc.perform : 요섳 실행 호출 허용 결과 인스턴스 반환 -> andExpect
	 * get (~) : applction/html HTTP get 요청 작성 
	 * andExpect : 예상한 값 확인 값이 맞지 않으면 테스트 실패
 	 * status.isOk() : ResultMatcher 사용 요청 성공(200)인지 확인
 	 * content.contentType(~): 응답 컨텐츠 유형 확인
 	 * content.string(~) : ResultMatcher로 응답 내용에 해당 문자가 포함되어있는지 체크
 	 */
	
	
}

 

- BasicViewController에 대한 Test 컨트롤러

package com.mastering.spring.springmvc.controller;

public class BasicViewControllerTest {

	
	private MockMvc mockMvc;
	
	 @Before
 	public void setUp() {
 		this.mockMvc = MockMvcBuilders.standaloneSetup(
 		new BasicController()
 	).setViewResolvers(viewResolver())
 	.build();

	}

    private ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver =
        new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
	
    @Test
    public void testWelcomeView() throws Exception {
        this.mockMvc.perform(
        get("/welcome-view")
            .accept(MediaType.parseMediaType("application/html;charset=UTF-8"))
        .andExpect(view().name("welcome"));
    }
}

 

- BasicModelMap 에 대한 Test 컨트롤러

package com.mastering.spring.springmvc.controller;

public class BasicModelMapControllerTest {

	
	private MockMvc mockMvc;
	
	 @Before
 	public void setUp() {
 		this.mockMvc = MockMvcBuilders.standaloneSetup(
 		new BasicController()
 	).setViewResolvers(viewResolver())
 	.build();

	}

    private ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver =
        new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
	
    @Test
    public void testModelMap() throws Exception {
        mockMvc.perform(
            get("/welcome-model-map")
            .accept(MediaType.parseMediaType("application/html;charset=UTF-8")))
        .andExpect(model().attribute("name","xyz"))
        .andExpect(view().name("welcome-model-map"));
    }
}

(단위 테스트의 impot 구문은 추후 업데이트 예정)


[ 어플리케이션 전체(통합) 테스트 ]

BasicTestController에 대한 전체 통합 테스트

package com.mastering.spring.springmvc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;

import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@WebMvcTest(controllers = BasicController.class)

@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration("file:src/main/web/webapp/WEB-INF/user-web-context.xml")
public class BasicControllerSpringConfigurationIT{

    @Autowired
    private MockMvc mvc;
    
    @Autowired
    private WebApplicationContext wac;
   
    @Before
    public void setup()
    {
	 this.mvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    			
    }
    
    @Test
    public void basicTest() throws Exception{

        this.mvc.perform(get("/welcome.action")
        		.accept(MediaType.parseMediaType("application.html;charset=UTF-8")))
                .andExpect(status().isOk())
                .andExpect(content().string("Welcome to Spring MVC"));
        
    }
}

BasicContoller 의 이벤트 url을 실행시켜 확인해보면 된다.