Spring/Test-Driven Develop 12

[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..

[Spring] 백엔드 부하 테스트 해보기 - nGrinder(with aws, jmeter)

부하테스트 툴을 알아보면 nGrinder 와 jmeter 이 2가지가 주를 이루어 나온다. jMeter JMeter 는 아파치에서 만든 java 기반의 오픈소스로 오래된 테스트 툴중 하나입니다. 꽤 오래되었고, 그만큼 안정적이라고 합니다. 많은 기능이 존재하고 확장성이 용이하지만 GUI가 이뻐보이진 않았습니다. 장점 아파치에서 만든 오래된 툴 유명하고 자료가 많다 다양한 프로토콜 지원 GUI, 이메일, DB, SSL 지원하는 기능과 플러그인이 많다 단점 모든 기능이 다 필요한가? 결과는 리스너로 만들어 보는데 모니터링이 불편함 스레드 기반이라 성능제약이 있다고 함 nGrinder nGrinder 는 네이버에서 만든 오픈 소스입니다. GUI도 보기 편해보였고, 비교적 사용하기 편하다고 합니다.. 고로! n..

반응형