Spring MVC [테스팅]

손정훈·2023년 3월 8일
0

테스트

  • 기능 테스트: 애플리케이션을 사용하는 사용자 입장에서 애플리케이션이 제공하는 기능이 올바르게 동작하는지를 테스트

  • 통합 테스트 : 애플리케이션을 만든 개발자 또는 개발팀이 테스트의 주체가 됨

  • 슬라이스 테스트 : 애플리케이션을 특정 계층으로 쪼개어서 하는 테스트

  • 단위 테스트 : 메서드 단위의 테스트


Junit을 사용한 테스트

기본구조

public class JunitDefaultStructure {
	@Test
    public void test1() {
    	// 테스트 로직
    }
    
    @DisplayName("assertEquals Test") 
   	@Test
    public void asserionTest() {
    	String expected = "Hello";
        String actual = "Hello";
        
        assertEquals(expected, actual);	// 기대값과 실제 결과값이 같은지 검증
    }
    
    @DisplayName("AssertionNull() Test")
    @Test
    public void assertNotNullTest() {
    	String name = CryptoCurrency.map.get("ETH");
    
    	assertNotNull(name, "should be not null");	// 테스트 대상 객체가 null이 아닌지 테스트
    }
    
    public class CryptoCurrency {
    	public static Map<String, String> map = new HashMap<>();
        
        static {
        	map.put("BTC", "Bitcoin");
            map.put("ETH", "Ethereun");
        }
    }
    
}

테스트 케이스 실행전, 전처리

public class JunitTest {
	@BeforeEach		// 테스트 케이스가 각각 실행될 때 마다 테스트 케이스 실행직전에 먼저 실행
    @Test
    public void beforeEachTest() {
    	// 테스트 로직
    }
    
    @BeforeAll	// 테스트 케이스가 실행되기 전에 딱 한번 실행
    public static void initAll() {
     	map = new HashMap<>();
        map.put("BTC", "Bitcoin");
    	map.puut("ETH", "Ethereum");
    }
    

테스트 케이스 실행 후, 후처리

테스트 케이스 실행이 끝난 시점에 후처리 작업을 할 수 있는 @AfterEach, @AfterAll 같은 애너테이션도 지원됨


Mockito

Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 역할

Mocking 기능을 이용하면 테스트 하고자 하는 대상에서 다른 영역을 단절시켜 오로지 테스트 대상에만 집중할 수 있음

class MockTest {
	@Autowired
    private MockMvc mockMvc;
    
    @Autowired
    Private Gson gson;
    
    @MockBean	// Mockito Mock 객체를 생성하고 주입
    private MemberService memberService;
    
    @Autowired	
    private MemberMapper mapper;
    
    @Test
    void memberTest() throws Exception {
    	// given
        MemberDto.Post post = new MemberDto.Post("hgd@gmail.com",
                                                        "홍길동",
                                                    "010-1234-5678");
				
        Member member = mapper.memberPostToMember(post);  // post 변수를 재사용하기 위해 MemberMapper로 변환
        member.setMemberId(1L);     // memberId 추가

        // stubbiong 메서드 // given: Mock 객체가 특정 값을 리턴하는 동작을 지정
        given(memberService.createMember(Mockito.any(Member.class)))
                .willReturn(member);	// createMember()메서드가 리턴할 Stub 데이터

        String content = gson.toJson(post);

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

        // then
       actions
                .andExpect(status().isCreated())
                .andExpect(header().string("Location", is(startsWith("/v11/members/"))));
    }

0개의 댓글