Spring JUnit TDD CRUD 기초

2019-10-14

참조: https://zorba91.tistory.com/106

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.popit.domain.BoardVO;
import com.popit.persistence.BoardDAO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml",
		"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class BoardDAOTest {

	@Inject
	private BoardDAO boardDAO;
	
	@Test
	public void testCreate() throws Exception {
		for (int i = 1; i<= 10; i++) {
			BoardVO vo = new BoardVO();
			vo.setTitle(i+ "번째 제목");
			vo.setContent(i + "번째 본문");
			vo.setWriter("writer" + i);
			boardDAO.create(vo);
		}
	}

	@Test
	public void testRead() throws Exception {
		boardDAO.read(20).toString();
	}
	
	@Test
	public void testUpdate() throws Exception {
		BoardVO vo = new BoardVO();
		vo.setBno(20);
		vo.setTitle("제목");
		vo.setContent("내용123");
		boardDAO.update(vo);
	}
	
	@Test
	public void testDelete() throws Exception {
		boardDAO.delete(29);
	}
}

일단 TDD를 해보기 위해서는 Spring test라는 dependency를 추가해야한다.

근데 이상하게 오류가 발생하는데 그러면 <scope>test</scope>를 삭제해주면 된다.

이건 test할때만 동작하게 한다는 그런 의미인데 이게 있으니 이상하게 작동을 안한다.

그래서 아래와 같은 형식으로만 추가했다.

junit에 있는 scope는 그대로 test로 놔뒀다.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>4.3.18.RELEASE</version>
</dependency>

@ContextConfiguration 이거 추가할때 autowire에 대한 오류가 발생한다.

근데 검색을 해도 너무 원인이 다양해서 해결이 안되다가 혹시나 해서 .xmlroot-context.xml, servlet-context.xml 둘다 참조 가능하게 했더니 해결됐다.

TDD 공부를 더하고 싶지만 일단은 기능 구현을 더 해야하므로 회원관련 테스트는 회원 생성만 해봤다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml",
		"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class UserDAOTest {
	
	@Inject
	private UserDAO userDAO;
	
	@Test
	public void testCreate() throws Exception{
		UserVO vo = new UserVO();
		vo.setPassword("j1234");
		String hashedPw = BCrypt.hashpw(vo.getPassword(), BCrypt.gensalt());
		
		vo.setEmail("j2u@ju.com");
		vo.setPassword(hashedPw);
		vo.setName("22it");
		userDAO.insertUser(vo);
	}
}

그냥 setPassword를 하면 암호화가 안되고 저장되니까 암호화 기능까지 넣어서 테스트 했다.

그리고 test라고 SQL에 값이 안들어가는게 아니고 실제로 다 들어가고 수정되고 삭제를 한다.

그래서 이 코드로 더미 데이터도 넣을 수 있다.

그리고 여담으로 Controller에서 Service를 선언할때 final을 같이 작성해주는데 이는 Controller 내부에서 다른요인으로 인해 수정이 불가능하게 만들어 준다.