[Spring MVC] 테스팅

강호수·2022년 11월 11일
0

JUnit 사용 테스트

  • 테스트 할 곳에 @Test 붙여주기

Assertion 메서드

import static org.junit.jupiter.api.Assertions.*
  • assertEquals(expected, actual)

    두 값이 같은지

  • assertNotNull(actual, "message")

    actual 해당 값이 null인지 아닌지, null일 경우 message 출력

  • assertThrows(Exception.class, () -> ~~ )

    람다식에 해당하는 것이 앞의 Exception이 발생하는지 테스트

처리

  • @BeforeEach

    각 테스트가 실행되기 전 실행

  • @BeforeAll

    테스트 케이스를 한번에 실행 시키면서 딱 한번만 초기화 작업을 할 수 잇게 만든다.

  • @AfterEach

    각 테스트가 끝난 후 실행 (초기화 해줄 때 주로 씀)

슬라이스 테스트

각 계층에 구현해 놓은 기능들이 잘 동작하는지 특정 계층만 잘라서 테스트 하는 것을 슬라이스 테스트라고 한다.

Controller 테스트

//given
주어진 상황
//when
이러한 때에
//then
이 값이 나와야한다

@SpringBootTest
@AutoConfigureMockMvc
class MemberControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private Gson gson;

    @Test
    void postMemberTest() throws Exception {
        // given
        MemberDto.Post post = new MemberDto.Post("hgd@gmail.com",
                                                        "홍길동",
                                                    "010-1234-5678");
        String content = gson.toJson(post);

        // when
        ResultActions actions =
                mockMvc.perform(                        
	                                post("/v11/members")  
                                        .accept(MediaType.APPLICATION_JSON) 
                                        .contentType(MediaType.APPLICATION_JSON)
                                        .content(content)   
                                );

        // then
        MvcResult result = actions
                                .andExpect(status().isCreated())
                                .andReturn(); 

        // System.out.println(result.getResponse().getContentAsString());
    }
}

위와 같이 Test를 하게 된다.

Gson을 통해 MemberDto 데이터를 json 형태로 변환
-> mockMvc를 통해 Controller 핸들러 메서드에 요청 전송
-> andExpect 등을 통해 원하는 값이 나왔는지 검증

데이터 액세스 계층 테스트

테스트 순서에 따라 다른 결과가 나올 수 있다. 따라서 각각의 테스트가 끝난 후 DB를 초기화 시켜주어야 한다.
이 때 쓸 수 있는 것이 @DataJpaTest 이다.

@ DataJpaTest

이는 @Transactional 애너테이션을 포함하고 있다. 따라서 하나의 테스트 케이스가 종료될 때 데이터베이스 안의 데이터는 rollback 처리가 된다.
여러 개의 테스트를 동시에 실행시켜도 된다.

Mockito

  • Mockito는 Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 기능을 한다.

  • @MockBean 애너테이션은 Application Context에 등록되어있는 Bean에 대한 Mock 객체를 생성하고 주입해주는 역할을 한다.

  • Junit에서 Spring을 사용하지 않고 Mockito의 기능만 사용하려면
    @ExtendWith(MockitoExtension.class)를 클래스 레벨에 추가한다

  • @Mock 애너테이션을 추가하면 해당 필드의 객체를 Mock 객체로 생성

  • 위의 객체는 @InjectMocks 애너테이션을 추가한 필드에 주입된다.

TDD

Test Driven Development

테스트를 하나씩 만들어가며 그정도씩만 만들어나감

0개의 댓글