JAVA/Spring Framework

스프링 Spring 프레임워크 jUnit과 연동하기

Tech Signal 2020. 10. 12. 19:14

<Spring과 jUnit 연동>

junit으로 테스트할 땐 서버를 실행되지 않는다. 하지만 dao를 주입받아 쓰려면 컨테이너객체가 생성되어야함 

 

=> 서버를 돌리지 않은 상태에서 컨테이너 객체를 생성하게 하는 어노테이션: @ContextConfiguration

상위, 하위 context 의 계층구조를 잘 생각해 구조대로 어노테이션을 넣어줘야함.

이때 형성되는 컨테이너: 애플리케이션 context.

테스트할 dao가 웹 어플리케이션 컨텍스트의 하위 객체가 되어야함. @WebApplicationConfiguration 

 

최종 테스트 (어노테이션 잘못 넣음)

+ test할때 자동 롤백되어야함 . => AOP 적용해 @Transactional을 넣어주자.


<컨트롤러를 대상으로 테스트하기>

컨트롤러는 request가 있어야함. Mock 객체를 사용하면 Mock req, Mock resp 만들 수 있음.

=>Spring의 MVC test module을 사용하면 됨

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; //상태코드 검증

@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration("test-servlet-context.xml")
public class ExampleTests {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void getAccount() throws Exception {
        this.mockMvc.perform(get("/accounts/1")
            .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
            .andExpect(status().isOk()) 							//상태코드 200을 체크
            .andExpect(content().contentType("application/json"))   //@ResponseBody 본다
            .andExpect(jsonPath("$.name").value("Lee"));
            //테스트중
    }
}

1. WebApplicationContext 주입받기 
2. MockMVC 주입받기 
- standalone으로 컨트롤러 하나하나씩 세팅 또는
- 모든 컨트롤러 세팅 

 

<서버가 동작하지않아도 sampleListener가 동작하게 하기>

EDD (Event Driven Development): Event Handler를 먼저 만들고 로직을 바꿔나감

TDD (Test Driven Development) :테스트 케이스를 먼저 만들고 타겟을 테스트 케이스에 맞춰 개발

 

SampleListener는 web.xml에 등록되어있다. = 톰캣이 관리한다.  = 컨테이너 밖에있다. = 컨테이너 안에 있는 것들은 주입받을 수 없다.

 

컨테이너 안에 있는 것 주입 받으려면

  1. web.xml에서 지우기
  2. pojo로 개발
  3. 실행하면 떠야하니까 상위 컨테이너에 등록 @Component
  4. ServletContext를 init() 안에서 값 넣어주기
  5. 메서드들에 @EventListener(value=ContextRefreshedEvent.class) 또는 ContextClosedEvent.class 달기
    1. 해당 이벤트들은 스프링이 관리하는 이벤트가 된다.