0

개념정리

목록 보기
27/33
post-thumbnail

단위테스트

  • 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경로는 정확하게.

  • 실행하고 싶은 메서드를 더블클릭 후 run As -> JUnit으로 돌림
  • assert~ : JUnit에서 제공해주는 메서드. 일반 자바에서는 못씀.
  • assertEquals (a, b) : a,b가 같은지 확인
  • 틀리면 위와 같이 X로 나옴

메인메서드는....

  • 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객체를 사용해야한다.
    	@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 
               // 예상한 것과 같은지 확인하는 코드
    		}
    → 복잡하기 때문에 controller는 postman으로 하고, dao는 JUnit으로 하기!
profile
백엔드를 공부하고 있습니다.

0개의 댓글