테스트

    Mock vs. Stub vs. Spy

    Mock과 Stub, Spy의 차이점에 대해 알아보기 전에 Test Double에 대하여 먼저 정리해보겠습니다. Test Double 테스트계의 스턴트맨. 영어에서는 Stunt Double이라고 부를 뿐이고, 한국사람들에게 더 익숙한 표현은 스턴트맨입니다. 테스트 코드에서 대역(가짜)을 쓰는 것에 착안하여 이름을 이렇게 지었고, 영화를 찍기 위해 위험한 액션을 대신해주는 것이 스턴트맨이라면 , 테스트를 통과하기 위해 액션을 대신해주는 것이 Test Double입니다. Test Double의 종류 더미 객체 (Dummy Object) Dummy Object는 전달되지만 실제로는 사용되지 않습니다. 일반적으로 파라미터를 전달하기 위한 용도로만 사용합니다. 모의 (Mock) Mock은 메소드를 호출했을 때 사..

    MockMvc 테스트시 andExpect(jsonpath())를 이용한 검증방법

    spring-framework/spring-test 테스트 예제 코드 Git Hamcrest 프레임워크 : hamcrest.org/JavaHamcrest/idnex 공식문서 깃허브 - 여기에 다 적혀있다. https://github.com/json-path/JsonPath 좋은 예제 - https://advenoh.tistory.com/28 https://joojimin.tistory.com/52 MockMvc를 이용하면 Json 형식의 API Response를 검증할 수 있다. 이 때 사용되는 것이 JsonPath() 이다. 주요 표현 예 다음은 https://github.com/json-path/JsonPath에서 제시하는 표현식 중 자주 사용되는 표현식에 대한 예이다. 추가적인 표현식은 원문에 자세..

    Java Collection, List, Array 비교, 검증

    예제 List List list1 = Arrays.asList("1", "2", "3", "4"); List list2 = Arrays.asList("1", "2", "3", "4"); List list3 = Arrays.asList("1", "2", "4", "3"); JUnit - Assert @Test public void whenTestingForEquality_ShouldBeEqual() throws Exception { Assert.assertEquals(list1, list2); Assert.assertNotSame(list1, list2); Assert.assertNotEquals(list1, list3); } AssertJ - Assertions @Test public void whenT..

    @WebMvcTest Security 401 403 응답 해결방법 - csrf

    @WebMvcTest Security 401 403 응답 해결 @WebMvcTest는 MVC와 관련된 애노테이션(Controller, ControllerAdvice, Filter, WebMvcConfigurer 등..)이 적용된 Bean들만 불러오고, @Component, @Service, @Repository와 같은 Bean들은 불러오지 않는다. https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTest.html 그리고 @WebMvcTest는 Spring Security를 auto-configure 한다 여기서 문제가 되는 것은 직접 구현한 Sprin..

    Mockito Verify, Mock Object 검증, 호출 횟수 검증

    Mockito Verify 메소드는 특정 동작이 발생했는지 확인하는 데 사용된다. mocking한 메서드가 호출되었는지 확인하기 위해 테스트 메서드 코드 끝에 Mockito 검증 메서드를 사용할 수 있다. https://github.com/WebJournal/journaldev/tree/master/Mockito-Examples 에 더 많은 예제가 있다. Mockito 검증 Mockito verify() 메서드를 사용하여 메서드 호출 수 (call count)를 테스트할 수도 있다. mock 메서드에 대해 정확한 횟수, 적어도 한 번, 최대 호출 횟수를 테스트할 수 있다. verifyNoMoreInteractions() : 모든 verify() 메서드 호출 후에 모든 것이 확인되었는지 확인할 수 있다 ...

    MockMvc 테스트시 201 created URI를 검증하는 방법

    현재 ItemController에서는 Resource 생성 시 201 created 응답과 함께 생성된 자원의 URI를 리턴해주고있다. @RequestMapping("/api/v1/items") @RestController @RequiredArgsConstructor public class ItemController { ​ private final ItemFacadeService itemService; ​ @PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public ResponseEntity createItem(@RequestBody @Valid ItemCreateRequest itemCreateReque..

    MockMvc 테스트 body가 '<no character encoding set>' 인경우

    @WebMvc 테스트 중 Request Body 데이터가 나오지 않는 상황이 발생. MockHttpServletRequest: HTTP Method = POST Request URI = /api/v1/items Parameters = {_csrf=[89d3f355-ea84-4108-b910-eebcb6795735]} Headers = [Content-Type:"application/json", Accept:"application/json", Content-Length:"505"] Body = // Session Attrs = {} Handler: Type = com.prgrms.bdbks.domain.item.api.ItemController Method = com.prgrms.bdbks.domain.i..

    JaCoCo

    JaCoCo는 자바 코드 커버리지를 체크하는 데에 사용되는 오픈소스 라이브러리 이다. 테스트를 실행하고, 그 커버리지 결과를 html 파일이나 csv, xml 파일을 통해서 시각화 하여 볼 수 있다. 또한, 결과에 대한 기준치를 적용하여 기준을 만족시키지 못 하면 배포, 커밋 빌드 실패 등을 적용 할 수 있다. 특히 코드정적분석도구인 sonarqube와 연계하여 사용하는 경우가 많다. Jacoco는 Java 바이트 코드를 기반으로 정적으로 커버리지를 측정해준다. http://www.semdesigns.com/Company/Publications/TestCoverage.pdf TestCoverage 측정 방법에 대한 논문이다. 공식 홈페이지 : https://www.jacoco.org/ 릴리즈 버전 : h..

    코드 커버리지(Code coverage)

    Coverage의 사전적 뜻 : 적용 범위 코드 커버리지란, 소프트웨어의 Test Case가 얼마나 충족되었는지, TestCode가 Production Code를 얼마나 실행했는지를 백분율(%)로 나타내는 지표 중 하나이다. Test를 진행하였을 때, '코드 자체가 얼마나 실행되었는지'를 나타내는것이고 이는 수치를 통해 확인할 수 있다. 즉 Test Code가 Production 코드를 얼마나 검증하고 있는지를 수치(혹은 %)로 나타내고 이 커버리지를 통해 현재 작성된 Test Code의 수가 충분한 것인지 논의할 수 있다. 원래 원칙적으로 test code는 모든 시나리오에 대해서 설계되어야 한다. 실제로 배포하는 서비스라면 더욱더 모든 시나리오를 커버해야만 한다. 그러나 현실적으로 내가 지금 작성한 ..

    JUnit5 생성자 주입 방법과 원리

    JUnit5 생성자 주입 방법과 원리 앞서 정리한 글 중에서, main 환경이랑 test 환경이랑 환경 자체가 달라서 생성자 주입이 안된다고 하였다. 그래서 대부분 @Autowired로 주입하거나, @BeforeEach로 테스트 시작 전에 직접 주입을 시켜주는 방식을 사용했다. 하지만 스프링 5.2.x 버전 부터 어노테이션을 통한 생성자 주입이 가능해졌다. (또 어노테이션이야?) 그런데 @Autowired 처럼 필드 하나하나마다 어노테이션을 선언하는 것이 아닌 1번만 선언해서 생성자 주입이 가능하다. 바로 @TestConstructor(autowireMode = TestConstructor.AutowiredMode.ALL) 을 사용하면 된다 spring.properties 파일을 통한 @Autowired..