콘텐츠로 이동

2021 10 24

2021-10-24

Spring에서 테스트 코드 작성하기

  • 참고: https://www.baeldung.com/spring-boot-testing
  • @SpringBootTest로 통합 테스트 진행하기 - 다른 계층의 어플리케이션을 테스트하는데 중점 (mocking을 포함해서) - 이상적으로는, 이를 단위테스트와 격리시켜 테스트를 작성해야한다. - 우선 컨테이너를 띄워서 테스트를 진행해야함 - @SpringBootTest로 전체 컨테이너 부트스트랩 가능 - ApplicationContext의 생성 - @TestConfiguration으로 실제 어플리케이션 컨텍스트에 사용되는 빈 말고 모킹할 수 있음 - @MockBean으로 모킹가능
  • @DataJpaTest로 통합테스트 - 엔티티와 DB 통합테스트 가능
  • @WebMvcTest로 통합테스트 - @WebMvcTest(EmployeeRestController.class) 로 단일 컨트롤러 클래스 테스트 - 서비스 레이어의 코드를 모킹 뚝딱해서 테스트 진행
  • 기타 설정을 쉽게 해주는 어노테이션들! - @WebFluxTest : 스프링 WebFlux 컨트롤러 테스트 지원 - @JdbcTest : JPA 어플리케이션 테스트에 용이. 하나의 데이터소스 요구 - @JooqTest : jOOQ 관련 테스트 - @DataMongoTest : 몽고DB 테스트 - @DataRedisTest : 레디스 어플리케이션 테스트 - @DataLdapTest : 인메모리 LDAP 테스트 - @RestClientTest : REST client에 대한 테스트 - @JsonTest : Spring 어플리케이션 컨텍스트 빈들중에 JSON 직렬화 필요한 놈 테스트

SpringBoot TestRestTemplate 알아보기

  • 참고: https://www.baeldung.com/spring-boot-testresttemplate
  • TestRestTemplate vs RestTemplate - 모두 통합테스트 작성에 적합, HTTP API와의 통신 처리 잘함 - 표준 메서드, 헤더, HTTP 구성과 동일하게 제공 - 하지만 TestRestTemplate은 RestTemplate을 확장하지 않으면서 흥미로운 새 기능을 제공
  • TestRestTemplate의 새로운 기능은 무엇인가? - 기본 인증 자격 있는 생성자
    TestRestTemplate testRestTemplate
     = new TestRestTemplate("user", "passwd");
    ResponseEntity<String> response = testRestTemplate.
      getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
    
    assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));   
    

    - HttpClientOption 있는 생성자

    TestRestTemplate testRestTemplate = new TestRestTemplate("user", 
      "passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
    ResponseEntity<String> response = testRestTemplate.
      getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
    
    assertThat(response.getStatusCode(), equalTo(HttpStatus.OK))
    

    - 자격을 얻어오는 새로운 방법

    TestRestTemplate testRestTemplate = new TestRestTemplate();
    ResponseEntity<String> response = testRestTemplate.withBasicAuth(
      "user", "passwd").getForEntity(URL_SECURED_BY_AUTHENTICATION, 
      String.class);
    
    assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
    

레거시 코드

  • 소프트웨어의 존재 가치 - 사용자를 위해 도메인에 관련된 문제 해결하는 능력 - 당면한 문제를 해결하지 못하는 SW는 실패한 SW. - 얼마나 빠른가, 얼마나 많이 처리할 수 있는가, 얼마나 많은 사람이 붙어서 사용할 수 있는가는 나중이야기!
  • 기존의 개발 - DB 종속적 어플리케이션 - DB 스키마 정해지면 모든 코드 결정
  • Anemic Domain Model - 빈약한 도메인 모델 - 객체 지향의 Object의 상태와 행위는 없음 - 그저 데이터만 가지는 데이터홀더 개념의 객체들,,, - 구조적인 한계들은 과도한 서비스 레이어의 사용을 부추김
  • Business Object - 비즈니스가 분산되어 구현된 오브젝트 - 동작을 실행하거나 관리하는 클래스 - 클라이언트 데이터에 대한 요청을 DAO에 호출하는 역할도 함
  • Big Service Layer - 거대한 서비스 레이어 != 객체지향의 설계 원칙 - 메인 로직 여러곳에 산재하고, 코드의 중복과 오브젝트 재활용성 떨어뜨림