묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
리액트 dockderfile 작성 시 COPY 질문
따라하며 배우는 리액트 A-Z 강의 중 리액트를 위한 도커 파일 작성하기 강의 중 궁금한 것이 있어 질문 드립니다 COPY 부분에 package.json 파일을 복사를 하는데package-lock.json 파일은 왜 복사를 하지 않나요?package-lock.json 파일이 더 버전 명시가 확실히 되어있어 안전하지 않나요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
EventListener 단위테스트와, 이벤트가 잘 작동하는지 통합테스트는 어떻게 하는걸까요?
강사님, 안녕하세요! Event 테스트 관련해서 질문이 있습니다!현재 진행하고 있는 프로젝트에서 이벤트를 활용해서 책임을 분리하고자 했는데요.질문을 드리기 전에, 잠깐 이벤트 적용처에 대해 간략히 설명해보자면 아래와 같습니다.현재 제 애플리케이션은 회원이 가입하게되면, 해당 유저와 1:1 연관관계를 갖는 메인계좌도 같이 생성을 해주어야합니다.따라서 회원가입 이벤트가 발생하면 메인계좌를 생성할수 있도록 아래와 같이 이벤트 리스너를 작성해주었습니다.@Slf4j @Component @RequiredArgsConstructor public class MemberSignupEventListener { private final CheckingAccountService checkingAccountService; @TransactionalEventListener(phase = BEFORE_COMMIT) public void createCheckingAccount(MemberSignupEvent event) { log.info("MemberSignupEventListener : 회원 가입 이벤트 발생 수신: 회원아이디 = {}", event.getMemberId()); checkingAccountService.create(event.getMemberId()); } }첫번째 질문으로는, 이벤트가 publish 되었을 때, 이벤트 리스너가 해당 이벤트를 잘 수신하는 지를 어떻게 테스트할 수 있을 지가 궁금합니다.제가 아래와 같이 테스트 코드를 작성해보았을 때,@SpringBootTest class MemberSignupEventListenerTest { @Autowired ApplicationEventPublisher eventPublisher; @MockBean MemberSignupEventListener memberSignupEventListener; @Test @DisplayName("회원가입이 이루어지면 회원가입 리스너가 이벤트를 수신한다.") void when_signup_then_create_checkingAccount() { // given Long memberId = 1L; MemberSignupEvent event = MemberSignupEvent.of(memberId); // when eventPublisher.publishEvent(event); // then verify(memberSignupEventListener).createCheckingAccount(any(MemberSignupEvent.class)); } }실패메시지는 아래와 같았습니다.Wanted but not invoked: memberSignupEventListener bean.createCheckingAccount( <any member.event.MemberSignupEvent> ); -> at member.event.MemberSignupEventListener.createCheckingAccount(MemberSignupEventListener.java:20) Actually, there were zero interactions with this mock.두번째 질문으로는, 회원가입 요청이 들어왔을 때, 메인계좌까지 잘 생성되는 지 통합테스트를 하고자 하는데, 어떻게 할 수 있을지가 궁금합니다.통합테스트 코드는 아래와 같이 작성해보았는데요.회원 레포지토지와 메인계좌 레포지토리에 데이터가 생성됐는 지로 검증하려 했습니다.(http 테스트로는 회원가입 시 회원데이터와 메인계좌가 DB에 생성되는 것을 확인했습니다.)아래 테스트 같은 경우 메인계좌의 DB 내 존재여부가 false로 나오면서 실패했고,이벤트 리스너와 메인계좌 생성 메서드 코드 라인을 잘 따라가는 지 디버그를 찍어봐도, 디버그로는 추적할 수가 없었습니다.@TransactionalEventListener(phase = BEFORE_COMMIT)으로 작성했기 때문에 동기적으로 동작할 것이라 생각했고, 별도의 스레드로 동작하지 않을 것 같은데, 디버그로 왜 추적이 안되는지도 잘 모르겠습니다..@DisplayName("회원 통합테스트") public class MemberIntegrationTest extends IntegrationTestSupport { private static final String URL = "/member"; @Autowired MemberRepository memberRepository; @Autowired CheckingAccountRepository checkingAccountRepository; @Test @DisplayName("회원 가입") void signup() throws Exception { // given MemberSignupRequest request = MemberSignupRequest.builder() .username("testUser") .password("1234") .build(); // when mockMvc.perform(post(URL) .contentType(APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))) .andExpect(status().isCreated()) .andDo(print()); // then assertThat(memberRepository.existsById(1L)).isTrue(); assertThat(checkingAccountRepository.existsById(1L)).isTrue(); } }이벤트 관련해서는 어떻게 테스트할 수 있을까요?실무에서는 보통 어떤 방법으로 진행될까요?---2024-08-19 수정 내용---혹시 jpa.hibernate.ddl-auto를 create-drop으로 해서 그런걸까요..?
-
해결됨Practical Testing: 실용적인 테스트 가이드
데이터 일관성유지를 어떻게 하면서 테스트하는지 궁금합니다.
안녕하세요. 인강 너무 잘 들었습니다. 궁금한 게 몇 가지 있어 질문드리게 되었습니다.현재 H2 데이터로 테스트 코드를 작성해 주셨는데요. 개발 환경의 DB 서버를 My-sql DB로 생성하고 테스트 코드를 구현하게 되면, 다른 개발자로 인해 DB의 데이터가 인입되면서 테스트 코드의 일관성이 깨지는 경우가 많이 발생되었습니다. 그렇다고 H2 데이터로 로컬환경을 붙이려고 하니 Mysql과 H2의 엔티티의 컬럼 선언이 다른경우가 존재해서 JPA의 자체 auto-ddl: create가 안먹히는 경우가 발생이되었습니다. [요약]개발 환경을 MY-SQL DB로 구현하면 같이 개발하면서 데이터가 인입되면서 테스트 코드의 일관성이 깨짐그렇다고 H2 DB로 진행하려고 하니, 엔티티의 칼럼 설정하는 것이 달라서 스프링 부트가 실행되지 않음Service Layer에서 일관성 있게 테스트 환경을 설정하려면 H2와 Mysql을 같이 돌릴 수 있게 프로젝트를 변경해 줘야 되는지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
잘못된 Interceptor 사용으로 인한 h2-console 접근 문제
안녕하세요. 강의에서 h2 db를 사용하시는 것을 보고 제 개인프로젝트에서 profile이 test일 경우에 h2 db를 써보기로 결정했습니다.그런데 제가 AuthInterceptor를 잘못 만들어서인지 localhost:8080/h2-console url로 접속하면 JSON 응답이 나와버립니다. 어떤 코드가 잘못되었는지, 어떻게 개선해야 하는지 봐주실 수 있으실까요..? 제가 작성한 코드와 설명을 남깁니다. application.ymlspring: profiles: default: local jpa: hibernate: ddl-auto: none mail: host: smtp.gmail.com port: 587 username: kanggi1997@gmail.com password: 보안을위해지웁니다 properties: mail: smtp: starttls: enable: true auth: true --- spring: config: activate: on-profile: local datasource: url: jdbc:postgresql://localhost:5432/forecast?useSSL=false driver-class-name: org.postgresql.Driver username: gunwoo jpa: properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect format_sql: true show-sql: true hibernate: ddl-auto: update --- spring: config: activate: on-profile: test h2: console: enabled: true # /h2-console 설정 datasource: url: jdbc:h2:mem:~/databasesByH2/forecastBE driver-class-name: org.h2.Driver username: sa password: jpa: properties: hibernate: format_sql: true show-sql: true hibernate: ddl-auto: create spring security를 사용하는데 어려움을 느껴 직접 인가를 구현하기 위해 AuthInterceptor와 WebConfig를 구성했고 사이트 회원만 api에 접근할 수 있게 만들었습니다. 로그인하지 않았을 경우 로그인이 필요하다는 메시지를 JSON형태로 전달합니다.AuthInterceptorpackage site.gunwoo.forecastBE.config; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import site.gunwoo.forecastBE.dto.ResponseDTO; @Component @Slf4j public class AuthInterceptor implements HandlerInterceptor { private ObjectMapper mapper = new ObjectMapper(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("OPTIONS".equals(request.getMethod())) { log.debug("preflight은 통과시킴"); return true; } String loggedInUserEmail = (String) request.getSession().getAttribute("loggedInUser"); if (loggedInUserEmail == null) { response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setCharacterEncoding("UTF-8"); response.setStatus(HttpStatus.UNAUTHORIZED.value()); ResponseDTO responseDTO = new ResponseDTO("로그인이 필요합니다.", null); String jsonResponse = mapper.writeValueAsString(responseDTO); response.getWriter().write(jsonResponse); return false; } return true; } } 아래의 addInterceptors 메서드에서 AuthInterceptor의 처리를 거치지 않아도 되는 uri를 정의했습니다. h2 콘솔 접근을 위한 uri인 "/h2-console"도 포함시켰습니다. 하지만 여전히 로그인이 필요하다는 응답이 JSON 형식으로 나타납니다.WebConfigpackage site.gunwoo.forecastBE.config; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { private final AuthInterceptor authInterceptor; @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:5173") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("Authorization", "Content-Type") .exposedHeaders("Custom-Header") .allowCredentials(true) .maxAge(3600); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor) .addPathPatterns("/**") .excludePathPatterns("/user/join") .excludePathPatterns("/user/login") .excludePathPatterns("/test") .excludePathPatterns("/regions") .excludePathPatterns("/h2-console"); //적용이 안되는 듯 } }
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
next.js에서부터는 react query 필요없는지
next.js를 도입하면 react query가 필요없어서 더 이상 안쓰시는건가요?? fetch를 쓰던 axios를 쓰던 next.js에서 알아서 캐시를 남겨주는건가요?? 아니면 fetch를 써야만 알아서 해주나요??
-
미해결Practical Testing: 실용적인 테스트 가이드
개인적으로 궁금해서 질문드려요!
저번에 OrderService 작성 시, LocalDateTime.now()를 사용하는걸 보고나서 강의대로 따라 안하고 인터페이스로 한 번 감싸서, 테스트코드에서는 고정된 값을 넣어 검증할 수 있게 바꿨습니다. (사실, 이 때 AfterEach를 쓰지않고 그냥 @Transactional을 사용해서 테스트가 깨지는지 바로 몰랐어요. 그대로 안해서 죄송해요 ㅠ) IntegrationTestSupport로 환경통합하는 섹션 듣는중에, 변경감지가 동작하지 않아서 디버깅해보니깐, stock.deductQuantity에서 변경감지가 동작하지 않더라구요. @Transactional을 붙여서 해결은 했는데 왜 동작이 안한건지 궁금합니다. https://drive.google.com/file/d/1E9-pN1QbrCyZ1w2G5CSP7JtnB6c7SFPf/view?usp=drive_link
-
미해결Practical Testing: 실용적인 테스트 가이드
다른데 글 남기는 곳을 못찾겠어서 여기에 남겨볼게요..
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 이런 질문 해도 되는지 모르겠지만강의에서 h2콘솔 접속하실때 초기에 보여지는 웹사이트 정보좀 알 수 있을까요?개발관련 정보들이 많은것 같아서 알고싶습니다!
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
2부 마지막 리팩토링 3:30쯤
2부 마지막 리팩토링 0:49에서, "service인데 controller.port를 잘못 참조했다"라고 하셨는데요.이를 수정하고 나신 후인 3:30쯤에서도, 여전히service(의 UserServiceImpl)가 controller(의 Port의 UserService)에 의존하는 상황이지 않나요?제 생각엔 Port 자체를 controller 밖으로 꺼내는 게 의미상 더 좋지 않을까 싶은데 어떻게 생각하시나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
static 사용 기준이 궁금합니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요!static 메소드 사용 기준이 궁금합니다!제가 알기로는 static메소드가 대표적으로 아래 3가지 이유 때문에 최대한 쓰지말라는 말을 들었는데요!1. 절차지향적이라 캡슐화에 위반된다.클래스로딩시점에 바로 올라가서 GC가 제거할 수 없는 영역에 있기 때문에 메모리 효율이 떨어진다.멀티 스레드 환경에서 공유되기 때문에 동시성 이슈가 있다.16분:17초에 나오는 static의 경우에는 3번에 해당하는건 아니겠지만, 강사님 영상에서 도메인이나 DTO영역에서 비즈니스 로직을 위한 객체 생성용 뿐만 아니라, 테스트 코드에서도 정적메소드로 만드시더라구요!static 키워드를 사용하는 기준이 언제인지 궁금한데요! @UtilClass도 내부적으로 static으로 만들어주던데, 비즈니스 로직이 담긴게 아닌 유틸클래스나 객체 생성용이라면 상관이 없는걸까요? 위에서 여쭤봤던 1번과 2번을 고려해야 하는 상황이 언제, 어떤 기준으로 설정 되는건지 궁금합니당..
-
미해결Practical Testing: 실용적인 테스트 가이드
Mockito활용시 void타입의 메소드는 어떻게 해야하나욤?
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요! 너무 좋은 강의 올려주셔서 감사합니다덕분에 엄청엄청 많이 도움받았습니다.궁금한점이 void타입의 검증메소드의 경우 mockito를 사용할때 reason: no instance(s) of type variable(s) T exist so that void conforms to T 라는 컴파일 에러가 나는데, wilThrow는 해야하거든요!이런 void타입의 경우는 어떻게 테스트하는지 궁금합니다!추가적으로 서비스 레이어를 sut으로 작성했지만 void타입일 경우 어떤 데이터를 검증해야하는지 궁금합니당.. 만약 마지막 흐름이 특정 레포지토리라면 해당 레포지토리가 호출되었는지 행위검증만하는 verfiy만 사용하면 될까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
병렬 테스트 시 DB처리
안녕하세요 강의 정말 잘 듣고 있습니다~!한가지 궁금한 점이 있는데,테스트 병렬 실행 시에 db는 어떻게 관리되는지 궁금합니다.테스트가 많아지면서 병렬로 실행하고 싶은데,db는 지금 h2 mem db 한군데만 바라보고 있어서테스트 간 같은 항목에 대한 처리들을 하면 실패로 이어집니다.어떻게 병렬로 실행할 수 있게 하는지 궁금합니다 ㅎㅎ그리고 인수테스트(RestAssured)도 진행중인데,인수테스트는 병렬 실행을 포기하는 편인지도 궁금하네요..
-
해결됨Practical Testing: 실용적인 테스트 가이드
객체 생성 시 검증 로직에 대해 질문드립니다.
객체를 생성할 때 입력 받는 데이터를 전부 검증하고 객체 필드를 업데이트할 때도 그 데이터가 유효한지 검증하는 방식을 사용한다면, 다른 레이어에서 검증된 데이터를 넣어 객체를 생성할 때도 해당 데이터를 객체 내부에서도 검증하게 되어서 중복으로 체크하는데, 이런 방식이 괜찮을지 아니면 객체에서 데이터 검증을 적당히 처리하고 레이어 별로 검증 책임을 중복되지 않게 처리하는 방식이 괜찮을지 질문드립니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
Order 단위 테스트
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 박우빈님, 좋은 강의 잘 듣고 있습니다.강의 영상 속에서 Order 단위 테스트 중 orderProducts에 관한 단위 테스트는 실시하지 않아 혼자 직접 진행했습니다.가장 먼저 다음과 같이 단위 테스트를 작성해보았습니다.@DisplayName("주문 생성 시 주문에 해당 상품이 포함된다.") @Test void orderProduct() { // given LocalDateTime registeredDateTime = LocalDateTime.now(); List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); // when Order order = Order.create(products, registeredDateTime); // then assertThat(order.getOrderProducts()).hasSize(2) .extracting("Product") .containsExactlyInAnyOrder( createProduct("001", 1000), createProduct("002", 2000) ); }하지만 위 사진처럼 Product 객체가 다르다고 판단되어 단위 테스트가 실패합니다.(createProdcut()를 이용한 새 객체 생성이 원인이라고 생각합니다.)그래서 다음과 같이 createProduct()를 빼서 테스트를 진행하니 성공했습니다.@DisplayName("주문 생성 시 주문에 해당 상품이 포함된다.") @Test void orderProduct() { // given LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 2000); List<Product> products = List.of( product1, product2 ); // when Order order = Order.create(products, registeredDateTime); // then assertThat(order.getOrderProducts()).hasSize(2) .extracting("Product") .containsExactlyInAnyOrder( product1, product2 ); }결론적으로 단위 테스트는 성공했지만 몇 가지 궁금증이 있습니다.orderProducts의 대한 단위 테스트(위 코드)가 적합한지orderProducts는 Order(this), Product를 갖고 있는데 Order(this)도 함께 검증하는게 맞는지긴 글 읽어주셔서 감사합니다.
-
미해결부트캠프에서 알려주지 않는 것들 (리액트) 1편
전부 입력된 코드들만 있는건가요? 따라치면서 하고싶은데...
(사진)
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
오류
안녕하세요 강사님. 강사님의 강의를 보고 블로그를 직접 만들어서 현재 공부기록을 올리고 있었습니다. 그러던 중에 갑자기 오류가 나면서 제 웹사이트에 접속이 안되는 문제가 발생하였습니다. 도메인은 giyeonss.com 입니다. 어떻게 해야 하나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트하기 어려운 영역을 분리하는 과정
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 박우빈님, 강의 잘 듣고 있습니다다름이 아니라 '테스트하기 어려운 영역을 분리하기' 세션 중 아래 코드와 같이 createOrder() 메서드를 오버로딩하여 테스트가 어려운 영역을 분리하여 테스트를 진행해주셨습니다.여기서 실제로도 어려운 영역을 분리하여 테스트 하기 위해 실제 비즈니스 로직에 테스트를 위한 메서드를 오버로딩하여 테스트 하는지가 궁금증이 생겼습니다.실무에선 해당 Test 클래스 내에서 메서드를 오버로딩 하여 사용하는 방식인가 싶은 생각도 들었습니다.실무에선 어떤 식으로 오버로딩하여 사용하나요?public Order createOrder() { LocalDateTime currentDateTime = LocalDateTime.now(); LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || currentTime.isAfter(SHOP_CLOSE_TIME)){ throw new IllegalArgumentException("주문 시간이 아닙니다. 관리자에 문의하세요"); } return new Order(currentDateTime, beverages); } public Order createOrder(LocalDateTime currentDateTime) { LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || currentTime.isAfter(SHOP_CLOSE_TIME)){ throw new IllegalArgumentException("주문 시간이 아닙니다. 관리자에 문의하세요"); } return new Order(currentDateTime, beverages); }
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
실습1의 커버리지 관련 설명이 잘 이해되지 않습니다
"테스트 추가하기: h2를 이용한 repository 테스트" 편의 10:39 에서, "잘 커버된 것 같아요"라는 말을 하셨는데 이 상황을 이해하기가 어렵습니다.PostEntity 와 관련된 테스트가 없는데 PostEntity 의 라인 14%가 충족되었다고 나옵니다. 이런저런 이유로 그냥 채워지는 경우도 있습니다만, 하단의 첨부 사진과 같이 제 화면에서는 0%로 보입니다. 혹시 이 차이가 왜 발생하는지 아시나요? (저는 temurin-17, IntelliJ Ultimate 2014.1.4 을 쓰고 있습니다) UserEntity 에도 동일한 질문을 드릴 수 있을 것 같습니다.UserRepository 인터페이스는 메서드가 존재하는데 0개 있다고 표기되고 있습니다 ("0/0"). 왜 이렇게 나오는지 아시나요?UserRepository 는 사실상 아무 메서드도 없다고 판단되었기 때문에 커버리지가 100% 로 나온 듯 합니다. 그 위의 PostRepository 도 (테스트가 없는데) 100% 로 나왔으니 그렇게 해석하는게 맞는듯 합니다. 따라서 이 대목에서 커버리지가 아무것도 측정되지 않은 것 같습니다. (위 1,2 질문의 대답에 따라 달라질수도 있겠지만) 여기까지 제가 이해한게 맞을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
한글 깨짐
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요.강의 따라가다 막히는 부분이 있어서 질문 드립니다.gradle 설정에서 Build and run using과 Run tests using을 인텔리제이로 바꾸면 한글 깨짐은 해결이 되는데 gradle로 실행하게 되면 한글이 깨집니다.설정에 들어가서 인코딩도 모두 utf-8로 설정해도 콘솔로 출력할 때 한글이 깨지는 현상이 발생합니다. 검색해보니 build.gradle에 설정을 utf-8로 변경하는 것도 있던데 결과는 똑같습니다.해결하는 방법이 있을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
통합 테스트 시 변수 지정은 어떻게 해주는게 좋을까요?
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. DB_URL과 같이 변수로 지정하여 통합 테스트를 수행할 경우 따로 설정해주어야하는데요. 저는 보통 인텔리제이에서 environment variables에 추가하여 실행해줍니다. 그런데 CI에서 빌드를 해줄 경우에도 변수를 지정해주어야하는데요. 테스트에도 지정하고 빌드할 때에도 지정해주는 것이 비효율적인것 같습니다. 이럴 경우 어떻게 설정해주는게 좋을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
외부API 연동 mocking시 json구조가 복잡하다면 어떻게해야하나요?
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요! 이번 강의 편에서 외부 API mocking에 대해서 다뤄주셔서 감사합니다!궁금한점이 현재 메일을 보내는 sendEmail의 경우 반환타입이 boolean이라 쉽게 테스트가 가능한것 같은데, 만일 RestTemplate/RestClient 와 같이 외부 API 연동한걸 mockito사용해서 가짜 객체로 테스트한다고 했을때, 실제 응답으로 받은 Json의 구조가 복잡할 경우에 어떻게 할지 궁금합니다.thenReturn() 메서드에 해당 응답의 Json구조를 반영한 DTO를 넣어주면 될까 싶었는데, 결국에는 외부 API 응답 구조를 알고 있어야 되는 거라 의존적이라고 생각이 들거든요! 만약 외부 API 응답의 Json 구조가 달라지면 테스트가 깨지게 되는건데, 외부 응답 구조를 몰라야 mocking의 의미가 있는게 아닌지 헷갈립니다.