Spring
Spring + Tomcat + junit 테스트 _ 1
아이티.파머
2008. 10. 29. 18:52
반응형
1. 이클립스에 스프링 플러그인을 설치하게 되면 xml생성시 오류없이 작성할수 있다.
2. 그럼이번에 스프링에사용될 jar파일 path를 걸어 주도록 하자.
A. preferences> java > buildpath > user libraries 여기에서 새라이브러리를 만들어 사용할
.jar파일을 추가 해주도록한다.
B. 사용할 .jar 파일 목록
Commons-dbcp.jar
Commons-lang.jar
Commons-logging.jar
Commons-pool.jar
mysql-connector-java-5.1.7
servlet-api.jar
spring.jar
3. 유저라이브러리에 등록하여 프로젝트 properties > java build path > libraries에 추가해준다.
이정도로 셋팅은 끝난듯 하다, 셋팅에 대한 자세한걸 원한다면 , 다음에 글로 다시 한번 남기는게 좋을것 같다
자 이번엔 직접 소스를 적어볼가?
일단 어떤 Class파일이 있는지 살펴보자
* Test 하기 위한 Class 파일
BoardDao.java
BoardDaoImpl.java
BoardDto.java
BoardController.java
* Test를 위한 Controller, Controller이름에 _Test를 붙였다.
BoardController_Test.java
* AOP를 위한 XML 설정 파일
application-context.xml
web.xml
web.xml
자 그럼이제 java 파일을 뜯어 보도록 하자.
첫번째. 자바파일 BoardDto 새로운 프로젝트를 구상하고 만드는거에 있어 속성 즉 DB에 저장될 값과 화면에 보여질 여러가지 속성값들이 미리 정의 대어 있어야 하지 싶다. ( 개인적인생각)
그럼 먼저 Dto부터 만들어보자. 초간단 테스트 이기때문에 속성값은 단두개다!! ^^;
자 그럼 java파일을 먼저 보기로 했짐나 일단 DB Table 부터 만들어보자.
테이블명 |
필드명 |
한글명 | 설명 |
Board |
subject |
제목 | 제목을 입력하는 필드 |
contents |
내용 |
가장많은 내용이 들어가 |
|
* 생성 SQL문
mysql> CREATE DATABASE mysqltest;
mysql> CREATE TABLE BOARD(subject varchar(20), varchar(80));
mysql> INSERT INRO BOARD('subject', 'contents') VALUES('제목','내용입력')
mysql> CREATE TABLE BOARD(subject varchar(20), varchar(80));
mysql> INSERT INRO BOARD('subject', 'contents') VALUES('제목','내용입력')
4-1 이제부터 본격적으로 자바 파일을 살펴보자. DB를 생성하고 소성에 뭐가 필요한지 알게 되었으니 "Dto"를 만들도록 하자. [ BoardDto.java]
package data.board.controller.dto;
public class BoardDto {
private String subject;
private String contents;
/**
* @return the subject
*/
public String getSubject() {
return subject;
}
/**
* @param subject the subject to set
*/
public void setSubject(String subject) {
this.subject = subject;
}
/**
* @return the contents
*/
public String getContents() {
return contents;
}
/**
* @param contents the contents to set
*/
public void setContents(String contents) {
this.contents = contents;
}
}
복잡하지 않고 구분하기 쉽게 db의 field명과 동일하게 명칭을 주었다. (이게더 햇갈리나?)public class BoardDto {
private String subject;
private String contents;
/**
* @return the subject
*/
public String getSubject() {
return subject;
}
/**
* @param subject the subject to set
*/
public void setSubject(String subject) {
this.subject = subject;
}
/**
* @return the contents
*/
public String getContents() {
return contents;
}
/**
* @param contents the contents to set
*/
public void setContents(String contents) {
this.contents = contents;
}
}
4-2 Dto를 생성했으니 이번엔 DAO를 만들어보자.(DAO라 하든 MANAGER라 하든 명칭이야 같다 붙이기 나름 아니겠는가~?) [BoardDao.java]
package com.board.controller.dao;
import org.springframework.dao.DataAccessException;
import data.board.controller.dto.BoardDto;
public interface BoardDao {
/**
*
* @return
* @throws DataAccessException
*/
public BoardDto get() throws DataAccessException;
/**
*
* @return
*/
public int get_2();
}
엇 인터페이스로 선언했구나, 그럼 어디선가 이걸 사용한다는건데, 자~ 자바의 기본구조를 설명하자니 너무길고,(사실 잘 기억이 안남) 아무튼 객체지향? 적으로 설계를 하라고하면 이렇게 하면댄다고 하기에 인스턴스를 생성하고 Class를 생성해서 상속받아 사용하면 된다고 했으니 한번 해보자 그럼import org.springframework.dao.DataAccessException;
import data.board.controller.dto.BoardDto;
public interface BoardDao {
/**
*
* @return
* @throws DataAccessException
*/
public BoardDto get() throws DataAccessException;
/**
*
* @return
*/
public int get_2();
}
4-3 위에걸 상속받아서 실제 Class를 구현해보자 클래스 이름은 [BoardDaoImpl.java]
/**
*
*/
package com.board.controller.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardDaoImpl extends NamedParameterJdbcDaoSupport implements BoardDao {
private static RowMapper boardMapper = new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum) throws SQLException{
BoardDto boardDto = new BoardDto();
boardDto.setSubject(rs.getString("SUBJECT"));
return boardDto;
}
};
/**
* @throws DataAccessExcption
* @return boardDt
*/
public BoardDto get() throws DataAccessException {
NamedParameterJdbcTemplate jt = getNamedParameterJdbcTemplate();
StringBuffer sb = new StringBuffer();
sb.append("SELECT * FROM BOARD");
HashMap paramMap = new HashMap();
BoardDto boardDto =(BoardDto) jt.queryForObject(sb.toString(), paramMap, boardMapper);
return boardDto;
}
public int get_2() {
System.out.println("단위테스트 수행시 묶여진 모든 Class는 전부 수행된다?");
return 3;
}
}
*
*/
package com.board.controller.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardDaoImpl extends NamedParameterJdbcDaoSupport implements BoardDao {
private static RowMapper boardMapper = new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum) throws SQLException{
BoardDto boardDto = new BoardDto();
boardDto.setSubject(rs.getString("SUBJECT"));
return boardDto;
}
};
/**
* @throws DataAccessExcption
* @return boardDt
*/
public BoardDto get() throws DataAccessException {
NamedParameterJdbcTemplate jt = getNamedParameterJdbcTemplate();
StringBuffer sb = new StringBuffer();
sb.append("SELECT * FROM BOARD");
HashMap paramMap = new HashMap();
BoardDto boardDto =(BoardDto) jt.queryForObject(sb.toString(), paramMap, boardMapper);
return boardDto;
}
public int get_2() {
System.out.println("단위테스트 수행시 묶여진 모든 Class는 전부 수행된다?");
return 3;
}
}
이번엔 뭔가가 길다.. 아 이걸 일일이 Commant달아서 설명하기가 힘들다.(사실나도잘 모름 Copy & Paste라서..)
자!! 이만 하고 그럼 'DTO', 'DAO' , 'IMPL' 도 했으니 이번엔 뭘 해야 하나...? 자 하나 남았다.
바로 Controller 그럼 이번에 Controller를 생성해 보도록 하자.
4.4 이곳에서 뭔가가 이러나고 즉 BL(BusinessLogic)이 생성되것지요? 그렇다면 한번 어떻게 생겼는지 봅시다.
package com.board.controller;
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardController {
private BoardDao boardDao;
private BoardDto boardDto = new BoardDto();
/**
* @return the boardDao
*/
public BoardDao getBoardDao() {
return boardDao;
}
/**
* @param boardDao the boardDao to set
*/
public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}
/**
* 기본테스트 목적 _1
* @return
*/
public int test(){
//TODO:
return 12;
}
/**
* 기본테스트목적 _2
* @return
*/
public int testDao(){
int i=boardDao.get_2();
return i;
}
public BoardDto get(){
boardDto = boardDao.get();
return boardDto;
}
}
import com.board.controller.dao.BoardDao;
import data.board.controller.dto.BoardDto;
public class BoardController {
private BoardDao boardDao;
private BoardDto boardDto = new BoardDto();
/**
* @return the boardDao
*/
public BoardDao getBoardDao() {
return boardDao;
}
/**
* @param boardDao the boardDao to set
*/
public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}
/**
* 기본테스트 목적 _1
* @return
*/
public int test(){
//TODO:
return 12;
}
/**
* 기본테스트목적 _2
* @return
*/
public int testDao(){
int i=boardDao.get_2();
return i;
}
public BoardDto get(){
boardDto = boardDao.get();
return boardDto;
}
}
음.. 뭐 대단한건 없고 일반 적인 거랑 비슷하게 생깄느디요? 그렇치요... 테스트만 성공해보자 하는 목적으로 만든거라보니 BL이라곤 하나두 읎는듯 ^^;;;
4.5 마지막으로 이걸 테스트 할수 있는 클래스!! [BoardController_Test.java]
/**
* =============================
* Copyright(c) 2008
* @FileName :
* @FileTitle :
*
* [Change History]
* LastModifier :
*
*/
package test.com.board.controller;
import java.sql.SQLException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.board.controller.BoardController;
import data.board.controller.dto.BoardDto;
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:/applicationContext*.xml" })
/**
* @ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"}) 다음과 같이 로케이션 정보를 적어준다.
* 그렇치 않다면 현재 위치의 MenmerTest Class 이름을 본따 MemberTest-context.xml 이라는 기본적인 이름을 찾게 된다
*/
@RunWith(SpringJUnit4ClassRunner.class) // 사용하고자 하는 junit Class 파일
@ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"})
public class BoardController_Test extends AbstractDependencyInjectionSpringContextTests {
/*
* AbstractDependencyInjectionSpringContextTests 를 사용하게 되면 테스트 후 DB rollback을 해준다.
*/
/**
* @Autowired : Setter 설정 없이도 Autowired를 사용 함으로써 Setter의 효과를 볼수 있다.
* 아키텍쳐 구조를 알기위해서는 좀더 자료를 찾아 볼것.
*/
@Autowired
private BoardController boardController;
// private ApplicationContext ctx;
private BoardDto boardDto= new BoardDto();
/**
* @Test : test를 수행하기 위한 method
*/
@Test
public void get_2(){
int i= boardController.test();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get_3(){
int i= boardController.testDao();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get() throws SQLException{
boardDto = boardController.get();
assertNotNull(boardDto);
System.out.println(boardDto.getSubject());
}
}
/**
* TEST 예전방식으로 Context를 설정해 줄때 사용 하는 방식인듯 하다.
*/
//String[] paths = {"E:/300. 소프트웨어공학/Source/Java_Source/SpringFreamWork/Board_WEB/WebContent/WEB-INF/spring-servlet.xml" };
//FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
//String[] paths = {"/WEB-INF/applicationContext.xml" };
//ctx = new ClassPathXmlApplicationContext(paths);
//boardController = (BoardController)ctx.getBean("boardController");
* =============================
* Copyright(c) 2008
* @FileName :
* @FileTitle :
*
* [Change History]
* LastModifier :
*
*/
package test.com.board.controller;
import java.sql.SQLException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.board.controller.BoardController;
import data.board.controller.dto.BoardDto;
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:/applicationContext*.xml" })
/**
* @ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"}) 다음과 같이 로케이션 정보를 적어준다.
* 그렇치 않다면 현재 위치의 MenmerTest Class 이름을 본따 MemberTest-context.xml 이라는 기본적인 이름을 찾게 된다
*/
@RunWith(SpringJUnit4ClassRunner.class) // 사용하고자 하는 junit Class 파일
@ContextConfiguration (locations = {"file:WebContent/WEB-INF/applicationContext.xml"})
public class BoardController_Test extends AbstractDependencyInjectionSpringContextTests {
/*
* AbstractDependencyInjectionSpringContextTests 를 사용하게 되면 테스트 후 DB rollback을 해준다.
*/
/**
* @Autowired : Setter 설정 없이도 Autowired를 사용 함으로써 Setter의 효과를 볼수 있다.
* 아키텍쳐 구조를 알기위해서는 좀더 자료를 찾아 볼것.
*/
@Autowired
private BoardController boardController;
// private ApplicationContext ctx;
private BoardDto boardDto= new BoardDto();
/**
* @Test : test를 수행하기 위한 method
*/
@Test
public void get_2(){
int i= boardController.test();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get_3(){
int i= boardController.testDao();
assertNotNull(i);
System.out.println(i);
}
@Test
public void get() throws SQLException{
boardDto = boardController.get();
assertNotNull(boardDto);
System.out.println(boardDto.getSubject());
}
}
/**
* TEST 예전방식으로 Context를 설정해 줄때 사용 하는 방식인듯 하다.
*/
//String[] paths = {"E:/300. 소프트웨어공학/Source/Java_Source/SpringFreamWork/Board_WEB/WebContent/WEB-INF/spring-servlet.xml" };
//FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
//String[] paths = {"/WEB-INF/applicationContext.xml" };
//ctx = new ClassPathXmlApplicationContext(paths);
//boardController = (BoardController)ctx.getBean("boardController");
테스트인데 뭐이리 길어 하시는 분도 분명 계실꺼다.. 사실 알고보면 짧은거다.. 메소드 마다 Commant도 달고 사용하지 않는건 주석처리가 많이되있어서 조금 길다.
자!! 이제 Test하기위한 Source는 다했다. 이제 XML을 설정하로 가자!!
반응형