단위테스트
- main이 아니라 junit만들어서 테스트
스프링 부트에 내장돼있는 junit 버전이 5이기 때문에 5로 사용할 것!
테스트 할때는 톰캣의 스프링 컨테이너를 사용하는 것이 아니라, 나름의 컨테이너를 구동해서 사용할 것
pom.xml에 추가
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.22.RELEASE</version>
<scope>test</scope>
</dependency>
// 테스트 클래스 위에 사용
@ExtendWith(SpringExtension.class) // 스프링 applicationContext 구동
@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/myApplicationContext2.xml")
// file경로는 정확하게.
메인메서드는....
- main 메서드는 스프링컨테이너와 별개로 실행되는 것(웹과 관련X)
- BoardDAOOracle은 어찌저찌 생성됐다 해도.
dao.selectAll()
메서드를 호출하려면 selectAll 메서드 내에는 스프링 컨테이너에서 자동주입받은sqlSessionFactory
를 사용해야하는데 이는 스프링컨테이너, 즉 엔진을 구동하고 있어야만 사용할 수 있기 때문에 톰캣을 실행시키지않은 main 메서드는 효과가 없음 =>NullPointerException
이 뜨게 됨.
단위테스트를 해야하는 이유
- 일반 메인메서드는 sout으로 하기때문에 가독성이 좋지 않음
- 테스트 주도 개발 기법이 한창 붐이였을 때가 있음
-> 각 메서드마다 단위테스트를 하게됨- dao를 만든 그 순간 junit테스트 처리를하고 통과를 하면 다음단위인 service -> controller를 만들어야 하는데 (단위테스트),
단위테스트를 안할 경우 dao, service, controller를 모두 만든 후 postman으로 돌려야 하는데 이때 문제가 생길경우 덩치가 너무 커져버려서 바꾸기가 힘들어짐.(폭포수 기법, 방법론)- 애자일이라는게 dao만들면서 그때그때 문제를 해결하고 service 만들고 해결 하고, 점차 조금씩 만들고 테스트하는.. 눈사람 만들듯 작게부터 시작하는것.
-> 단위테스트는 필수이다.
컨트롤러도 단위테스트 할 수 있다.
- 하지만, 배보다 배꼽이 더 클 수 있다.
- 입사해서 교육받거나 스터디할 때 컨트롤러 Mocker 테스트 방법 사용해보기
- 아래에 기본 설정
@ExtendWith(SpringExtension.class) // 스프링 applicationContext 구동 @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/myApplicationContext2.xml", // 정확한 설정 파일 위치 적기 "file:src/main/webapp/WEB-INF/myServletContext.xml" }) // 스프링 컨테이너가 webApplicationContext로 구동 될 수 있도록 해줘야함. // dispatcher servlet을 등록한 것과 비슷한 효과를 내는 어노테이션이 필요하다. @WebAppConfiguration
mock
: 가짜의, 스프링 mvc를 지원하기 위한 entry point
- 컨트롤러를 직접 사용할 수 없어서 mocker객체를 사용해야한다.
→ 복잡하기 때문에 controller는 postman으로 하고, dao는 JUnit으로 하기!@Test void testFindAll() throws Exception { mockMvc= MockMvcBuilders.webAppContextSetup(ctx).build(); // 테스트 코드마다 포함돼야함 String url = "/board/list"; // postman으로 요청한 것과 동일 MockHttpServletRequestBuilder msrb; msrb = MockMvcRequestBuilders.get(url); // get방식으로 요청 ResultActions actions = mockMvc.perform(msrb); // 응답 actions.andExpect(MockMvcResultMatchers.status().isOk()); //응답 상태가 200 // 예상한 것과 같은지 확인하는 코드 }