본문 바로가기
Spring

Spring + Tomcat + junit 테스트 _ 1

by 아이티.파머 2008. 10. 29.
반응형

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


자 그럼이제 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('제목','내용입력')

 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명과 동일하게 명칭을 주었다. (이게더 햇갈리나?)

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를 생성해서 상속받아 사용하면 된다고 했으니 한번 해보자 그럼

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;
    }

}

이번엔 뭔가가 길다.. 아 이걸 일일이 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;
       
    }

}

음.. 뭐 대단한건 없고 일반 적인 거랑 비슷하게 생깄느디요? 그렇치요... 테스트만 성공해보자 하는 목적으로 만든거라보니 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");

테스트인데 뭐이리 길어 하시는 분도 분명 계실꺼다.. 사실 알고보면 짧은거다.. 메소드 마다 Commant도 달고 사용하지 않는건 주석처리가 많이되있어서 조금 길다.

자!! 이제 Test하기위한 Source는 다했다.  이제 XML을 설정하로 가자!!





반응형