Spring/Test-Driven Develop 13

Spring Boot WebClient Mocking 하기

상당히 오랜만에 글을 쓰네영반성하고 열심히 재밌게 다시 써보겠습니다 야호코드는 깃허브에 있습니다. 새로운 회사로 이직한지 1달이 되었습니다.여느 회사나 마찬가지로 제가 모르는 코드를 수정해야하기 때문에 테스트 코드는 저에게 필수적인데요.오늘은 Spring Boot WebFlux 와 함께 나온 WebClient 를 Mocking 하는 방법에 대해 기록해보고자 합니다. [목차]WebClient 를 Mocking 하려는 이유WebClient Mocking 방법1. WebClient를 Mocking 하려는 이유사실 WebClient 자체를 Mocking 하는 상황이 좋은 상황은 아니라고 생각합니다.코드단에서 더 좋은 방향은 WebClient 를 사용하는 부분을 추상화하고 호출부에서 추상화하는(or 책임을 가지는..

[Spring] Embedded MongoDB! 통합테스트를 위한 인메모리 몽고디비 설정하기

현재 mongodb와 mysql 을 함께 사용하고있는 프로젝트에서 통합테스트를 위해 mongodb 도 h2 같은 in-memory db로 사용할 수 있는게 없을까 찾아보다가 알게된 방법에 대해 정리하는 글 입니다. 공식적으로 Spring Document 에 언급된 in memory 방식의 nosql db 를 사용할 수 있는 방버을 찾지못해 오픈소스 라이브러리를 사용하였습니다. 참고해주세요! ✔️ Spring Boot 환경에서 Embedded MongoDB 를 사용하는 3가지 방법 1) de.flapdoodle.embed.mongo.spring embeded mongodb 라고 검색하면 가장 많이 나오는 오픈소스 라이브러인 것 같습니다. 나온지 10년 가까이된 것 같고, 지금까지도 활발하게 contribu..

[Spring] 테스트 환경 격리 시키기 - 각 테스트마다 DB 분리하기 (@Transactional 을 사용하면 안되는 이유)

🔥현재 NEXT STEP 에서 진행하는 ATDD 강의를 수강하고 있습니다. 강의에서 예전부터 고민하던 통합테스트 환경에서 데이터베이스를 격리하는 방법에 대해 알게되어 기록을 남겨보고자 합니다. [예전에 시도해봤던 방법] 통합테스트 환경에서 시도한건 아니지만 단위테스트에서 JPA 에 의존하는 Repository 를 온전히 격리해 어떤상황에서든 성공하는 단위테스 환경을 구축하고자 했던적이 있습니다. 👉 service 단위 테스트 하기 - DB 와 독립된 테스트 환경 구축 (service unit test) 하지만 1. 단위테스트 환경에서는 사실상 Mocking 을 하는것보다 큰 장점이 없었고 2. 필요로하는 Repsitory 기능을 매번 정의해주어야해서 많이 번거로웠습니다. 👏🏻 그치만 통합테스트 환경에서는..

[Spring Security] @AuthenticationPrincipal 유닛 테스트 - Custom Mock User 삽입하기

✨ 이번 포스팅에서는, @AuthenticationPrincipal 유닛 테스트에 대해서 기록해보고자 합니다. 현재 프로젝트는 JWT + Spring Security를 사용하고 있고, Spring Security 에서 제공해주는 User 객체가 아닌 실제 디비에 저장되어있는 Custom 한 User 정보를 이용해 인증된 유저를 SecurityContextHolder에 저장하는 방식으로 구현해놓았습니다. 참고 👉 Spring Security 가이드 (with. Spring boot 3.0) - 스프링 시큐리티란, 동작 과정, 사용 방법, JWT 발급 그렇기 때문에 요청이 들어오는 Rest API 에 담긴 JWT가 정상적으로 인증이 가능한 토큰이라면 → 지속적으로 DB에 접근하지 않고도 로그인한 객체 정보를..

[Java] LocalDate.now() mocking - 정적 메소드 테스트 하기

이번 포스팅에서는 LocalDateTime 혹은 LocalDate 의 now() 를 테스트를 위해 mocking 하는 방법에대해 공부해보고자 합니다. (포스팅에 나오는 모든 코드는 회사 코드의 형식을 유지하면서 수정한것이기 때문에 뭔가 이상할 수 도 있습니다. 👍) 📌 얼마전에 오늘 일자로 특정 날짜가, 몆 주차이인지 계산하는 로직을 작성하여 이를 테스트하고자 했습니다. 하지만 막상 테스트를 짤려하니, LocalDate.now() 메소드는 static 메소드이긴 때문에 목킹하여 항상 성공하는 테스트 케이스를 작성하는데에 어려움이 있었서, 찾아보니 2가지 방법을 찾을 수 있었습니다. 첫번쨰는, Mockito를 이용하여서도 static method 를 mocking 하는 것이고 (PowerMock 을 이용해..

[Spring] service 단위 테스트 하기 - DB 와 독립된 테스트 환경 구축 (service unit test)

📌 이번 포스팅의 목적은 "Repository 에 의존하지 않는 Service Test" 와 "항상 성공하는 테스트 환경" 을 구축해보는 것입니다! 지금 사내에서는 service : repository = 1:1 구조로 가고있는데 repository 에서 조회하는 데이터 값의 조건에 따라서 다르게 흘러가는 로직을 테스트하고 싶었습니다. 한마디로 Repository 의 의존도를 가지고있는 Service 레이어를 테스트하고싶었는데 유닛테스트로 빠르게, 데이터베이스에 의존하지 않게 테스트하면서 Mocking 보다는 실제환경과 유사하게 테스트환경을 구축하고 싶었습니다. 👏🏻 즉, 조건을 정리하자면 유닛테스트 테스트에서 Repository 의존도 분리 mocking 말고 실 데이터 사용 항상 성공하는 테스트 작성..

[Junit] @ParameterizedTest 객체에 값을 자동으로 넣어주는 Auto Param - @autosource

지인이 테스트 코드를 짤 떄, 파라미터의 값을 자동으로 세팅해주는 요상한게 생겼다고 해서 사용을 해보았습니다. 강남언니 CTO 이규원님이 만든 오픈소스라고 하더군요 AutoParams는 AutoFixture에서 영감을 받은 Java의 매개변수화된 테스트를 위한 임의 테스트 데이터 생성기입니다. Auto Param 이 제공하는 기능은, 매개변수에 값을 자동으로 주입해줍니다. 리터럴 변수, Enum, Object, Generic, Collection, Primitive Type Stream 까지 지원을 해줍니다.. (굉장해) @AutoSource 사용해보기 @ParameterizedTest 와 @AutoSource 어노테이션을 사용이용해서 간편하게 사용할 수 있습니다. Auto Param을 사용하기 위해서는..

[Junit] Test Fixture 란 ❓

Test Fixture 의 이해를 위한 글입니다. Test Fixtures 개념을 실제로 사용하는 2가지 방법을 다룹니다. 코드는 ⚙️ Github 에 있습니당!! Test Fixture 란 일종의 개념이라고 생각합니다. 중복 발생되는 무언가(행위)를 고정시켜 한곳에 관리하도록 하겠다는 개념. Test Fixture 를 사용 예시 금액과 나라를 가지고있는 Money 객체가 있다고 해봅니다. @Getter @AllArgsConstructor @EqualsAndHashCode public class Money { private int money; private String country; /** 돈 더하기 **/ public Money add(Money anotherMoney) { checkOrigin(an..

[JUnit] JAVA 매개변수 Test - @ParameterizedTest

🚀 오늘은 다양한 매개변수 케이스를 하나의 테스트 메소드에서 주입시켜주는 @ParameterizedTest 어노테이션의 다양한 케이스들의 가이드를 기록해보고자 합니다...!! [목차] @Parameterized란 @Parameterized 가이드 @Parameterized 공급자 종류 @Parameterized란 @ParameterizedTest 어노테이션은 Junit 에서 다양한 매개변수들에 대한 경우를 테스트할 수 있도록 제공해주는 어노테이션입니다. @ParameterizedTest 주석이 달린 메소드는 매개변수화된 테스트 메소드임을 의미하고 Private, Static 이 아니어야 합니다. @Parameterized 시작 가이드 의존성 추가 먼저 JUnit Jupiter Params 의존성을 추가해..

[Spring] java private 메소드 테스트 코드 작성하기

Junit 을 사용해서 유닛테스트를 작성할 때, private 접근제어자로 선언된 메서드가 반환하는 값을 테스트 하고 싶었습니다 ex) Private Method public test { private String getString(final String name, final int age) { return name + age; } } 여러 방법이 있었지만, 저는 간단하게 Spring Framework에서는지원해주는 ReflectionTestUtils를 사용해주었습니다 @Test @DisplayName("private 메소드 접근하기") void fillDate_continuity() { //given String name = "test"; int age = 5; //when final String re..