2018년 5월 28일 월요일

패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 35일차(Test, 공부방법)

Controller 테스트

@RunWith(SpringRunner.class)
@WebMvcTest(BoardController.class)
  1. RunWith는 Runner를 구현한 객체를 이용해서 Test를 수행한다.
  2. SpringRunner는 내부적으로 ApplciationContext를 가지고 있고, 해당 Test객체도 Bean으로써 등록된다.
  3. @WebMvcTest : Spring MVC를 테스트를 사용하기 위한 애노테이션이다.
    Controller는 여러개의 Service를 사용한다. Service의 구현과 상관없이 Controller를 테스트해야한다.
    이것이 올바른 Controller의 단위테스트가 된다.
    @WebMvcTest(BoardController.class) : BoardController를 테스트하겠다.
@Autowired
private MockMvc mvc;
@WebMvcTest를 사용하면 MockMvc를 주입받을 수 있다. WAS를 실행하지 않고, Controller를 실행하도록 도와준다.

mvc.perform(get("/boards").with(new RequestPostProcessor() {
    @Override
    public MockHttpServletRequest postProcessRequest(MockHttpServletRequest mockHttpServletRequest) {
        User user = new User();
        user.setId(1L);
        user.setName("홍길동");
        mockHttpServletRequest.setAttribute("loginUser", user);
        return mockHttpServletRequest;
    }
}))
.andExpect(status().isOk()) // 200 OK면 성공
.andExpect(model().attribute("list", page)) // ModelMap에 값을 담으면, 템플릿까지 값이 전달된다. Controller에서 ModelMap에 "list"란 이름으로 값을 담았는데, 그게 page와 같은지 본다.
.andExpect(content().string(containsString("test1"))); // content()는 템플릿엔진을 통해 랜더링한 결과에 "test1"이라는 문자열이 있는지 본다.
}
mvc는 Spring MVC가 controller를 실행하는 것을 시뮬레이션 한다. perform메소드는 controller의 특정메소드를 get, post, put, delete등으로 실행하도록 한다.
@MockBean
BoardService boardService;
BoardController가 의존하고 있는 Service를 Mock으로 설정한다.
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>5.0.4.RELEASE</version>
    <scope>test</scope>
</dependency>
테스트를 할 때 Spring security와 관련된 부분을 도와주는 라이브러리를 추가한다.
Test메소드를 만든다.
@WithMockUser(username = "admin@gmail.com", authorities = {"USER"})
로그인한 사용자의 username과 권한을 지정할 수 있다.
// with()부분은 Controller가 아닌 인터셉터에서 로그인한 정보를 저장하는데,
// 이 부분이 템플릿에서 사용하기 때문에 request에 로그인한 정보를 넣어줌.
ResultActions content1 = mvc.perform(get("/boards/1")
    .with(mockHttpServletRequest -> {
        User user = new User();
        user.setId(1L);
        user.setName("홍길동");
        mockHttpServletRequest.setAttribute("loginUser", user);
        return mockHttpServletRequest;
    }))
    .andExpect(status().isOk())
    .andExpect(content().string(containsString("content1")));
인터셉터에서 정보를 넣어주는 로직이 있을때 사용한다.

공부방법

  1. 책과 문서를 보며 어려웠던 부분과 중요한 부분을 체크하며 읽는다. 흐르듯이!(메모장등에 체크)
  2. 깃허브에서 소스를 보면서 내가 그 프로젝트를 만든다고 생각하고 소스를 본다.
  3. 궁금한점은 검색하면서 좋은 소스들을 찾아서 본다.
  4. 샘플코스를 작성한다. 라이브러리 및 프로그램이 이미 정해져있다.
  5. 잘하는 프로그래머한테 리뷰를 요청한다.
  6. 다른사람에게 설명한다.
  7. 개발할때 스스로에게 설명하면서 만든다.(이해 안가는게 있으면 적어놓던지 찾아본다.)







Share:

0 개의 댓글:

댓글 쓰기