inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

안녕하세요 개발과 상관없는 질문입니다만

미해결

따라하며 배우는 리액트 A-Z[19버전 반영]

안녕하세요 강사님 좋은 강의 감사드립니다 vscode 테마 정보좀 알수있을까요?

  • react
  • redux
  • tdd
  • typescript
  • next.js
  • 소프트웨어-테스트
jaehoon 댓글 1 좋아요 0 조회수 149

최종 완성된 코드를 받아 볼 수 있을까요?

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

안녕하세요. 강의 잘 듣고 있습니다^^ 최종완성된 코드를 받아서 확인해보고 싶은게 있는데 공유 가능할까요?

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
SH ks 댓글 1 좋아요 0 조회수 182

테스트 반복하기 관련 질문입니다

미해결

더 자바, 애플리케이션을 테스트하는 다양한 방법

@DisplayName("파라미터 테스트") @ParameterizedTest(name = "{index} {displayName} message={0}") @ValueSource(ints = {10, 20, 40}) void parameterizedTest(Study study){ System.out.println(study.getLimit()); } Junit5 테스트 반복하기 2부에서 이 부분 질문드리려 합니다. 강의에서는 Study 타입으로 받아서 객체를 생성하고 getLimit으로 값 가져오는 것까지 묵시적으로 진행이 잘 되었습니다만, 제 환경에서는 ```java Error converting parameter at index 0: No built-in converter for source type java.lang.Integer and target type com.example.testpractice.Study org.junit.jupiter.api.extension.ParameterResolutionException: Error converting parameter at index 0: No built-in converter for source type java.lang.Integer and target type com.example.testpractice.Study at java.base/ java.util.stream .ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/ java.util.stream .ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/ java.util.stream .ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/ java.util.stream .ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/ java.util.stream .ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/ java.util.stream .ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/ java.util.stream .ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/ java.util.stream .ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ``` 와 같은 에러가 발생해서 Junit이나 JDK의 버전에 따라 스펙이 바뀌었는지 궁금해져서 질문드립니다

  • java
  • junit
  • mockito
  • testcontainers
  • jmeter
  • chaos-monkey
  • archunit
  • 소프트웨어-테스트
woo 댓글 1 좋아요 0 조회수 148

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

미해결

Practical Testing: 실용적인 테스트 가이드

OrderControllerDocsTest.java @DisplayName("주문 생성 API") @Test void createOrder() throws Exception { OrderCreateRequest request = OrderCreateRequest.builder() .productNumbers(List.of("001")) .build(); LocalDateTime now = LocalDateTime.now(); given(orderService.createOrder(any(OrderCreateServiceRequest.class), any(LocalDateTime.class))) .willReturn(OrderResponse.builder() .id(1L) .totalPrice(4000) .registeredDateTime(now) .products(List.of(ProductResponse.builder() .id(1L) .productNumber("001") .type(ProductType.HANDMADE) .sellingStatus(ProductSellingStatus.SELLING) .name("아메리카노") .price(4000) .build())) .build()); mockMvc.perform(post("/api/v1/orders/new") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value("200")) .andExpect(jsonPath("$.message").value("OK")) .andExpect(jsonPath("$.status").value("OK")) .andDo(document("order-create", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields( fieldWithPath("productNumbers").type(JsonFieldType.ARRAY) .description("상품 번호") ), responseFields( fieldWithPath("code").type(JsonFieldType.NUMBER) .description("코드"), fieldWithPath("status").type(JsonFieldType.STRING) .description("상태"), fieldWithPath("message").type(JsonFieldType.STRING) .description("메시지"), fieldWithPath("data").type(JsonFieldType.OBJECT) .description("응답 데이터"), fieldWithPath("data.id").type(JsonFieldType.NUMBER) .description("주문 ID"), fieldWithPath("data.totalPrice").type(JsonFieldType.NUMBER) .description("주문 총 금액"), fieldWithPath("data.registeredDateTime").type(JsonFieldType.ARRAY) .description("주문 시각"), fieldWithPath("data.products").type(JsonFieldType.ARRAY) .description("주문 상품"), fieldWithPath("data.products[].id").type(JsonFieldType.NUMBER) .description("상품 ID"), fieldWithPath("data.products[].productNumber").type(JsonFieldType.STRING) .description("상품 번호"), fieldWithPath("data.products[].type").type(JsonFieldType.STRING) .description("상품 타입"), fieldWithPath("data.products[].sellingStatus").type(JsonFieldType.STRING) .description("상품 상태"), fieldWithPath("data.products[].name").type(JsonFieldType.STRING) .description("상품 이름"), fieldWithPath("data.products[].price").type(JsonFieldType.NUMBER) .description("상품 가격") ))); } docs/index.html 에서 확인한 registeredDateTime 처음에 테스트 코드 작성시에 ieldWithPath("data.registeredDateTime").type(JsonFieldType.ARRAY) .description("주문 시각"), 이 부분을 JsontFieldType.STRING 으로 했더니 테스트 실패 메시지에 해당 타입이 Array 라고 해서 바꿨는데... 문서에 저렇게 나옵니다. 이게 맞는건지 궁금합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
ewgregerg c 댓글 2 좋아요 0 조회수 225

test 용 .yml

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 좋은 강의 감사합니다. 강의에서는 테스트에 사용되는 설정 파일을 main/resources/~.yml 파일을 사용하셨는데요. 혹시 test 패키지에 별도의 .yml 파일을 둬서 사용하는 것은 어떻게 생각하시나요? 보통 어떻게 하는 것이 올바르고? 장단이 있을지 궁금합니다. 강사님 의견도 궁금하구요! 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
highjune 댓글 2 좋아요 0 조회수 127

throws Exception

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 좋은 강의 감사합니다. 테스트마다 보통 throws Exception 으로 처리하는 경우가 많은데, 별도로 checked exception 에 대해서는 신경을 안 써도 되는걸까요? 강사님의 의견이 궁금합니다! 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
highjune 댓글 2 좋아요 0 조회수 112

카페키오스크 클래스 문의 ,,

미해결

Practical Testing: 실용적인 테스트 가이드

학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. CafeKiosk 클래스 의 add를 아래처럼 구성 했습니다. public void add(Beverage beverage, int count) { if(count <= 0){ throw new IllegalArgumentException("음료는 1잔 이상 주문 하실 수 있습니다."); } for(int i = 0; i<count; i++){ beverages.add(beverage); } } 3:54 초에 add에 americano 변수 1개만 들어 가는데 강의에는 오류가 안나네요..? 저는 count 값도 입력하라고 나옵니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
itboxer91 댓글 2 좋아요 0 조회수 119

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

미해결

Practical Testing: 실용적인 테스트 가이드

ProductControllerDocsTest 를 따로 작성하지 않고 기존에 작성했던 ProductControllerTest 에 Rest Docs 용 코드를 얹어서 작성해도 상관없나요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
ewgregerg c 댓글 2 좋아요 0 조회수 220

테스트 코드에서 필요한 생성자

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 좋은 강의 감사합니다. 잘 듣고 있습니다. 두 가지 궁금한 것이 있습니다. 테스트 코드에서만 필요한 생성자가 있다면, 그 생성자를 위해서 해당 객체나 엔티티에 생성자를 추가하는 과정이 옳은 것일까요? 아니면 애초에 그런 생성자가 필요한 상황 자체가 잘못된 것일까요? (프로덕션 코드를 테스트하는 것이 목적이니, 프로덕션 코드에서 이미 사용되고 있는 생성자를 쓰면 되지 않냐..) 모 회사에서는 @Builder 패턴은 무조건 restdocs 를 생성하는 경우에만(fixtures) 사용하라고 해서 프로덕션 코드에서는 무조건 생성자만 사용한 경우가 있었는데 @Builder 패턴의 사용 범위? 그런 것들은 어떻게 생각하시나요!? 강사님의 의견이 궁금합니다. 좋은 강의 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
highjune 댓글 1 좋아요 0 조회수 170

tearDown 순서

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 강의 중반에 OrderServiceTest 할 때 작성하셨떤 tearDown() 에서 @AfterEach void tearDown() { orderProductRepository.deleteAllInBatch(); productRepository.deleteAllInBatch(); orderRepository.deleteAllInBatch(); } 위의 순서를 지키지 않으면 왜 테스트가 깨지나요? 어차피 매번 수행한 후에 데이터를 다 지우는 것은 동일하잖아요. fk 때문에 지워지지 않는 이유에서 그런건가요.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
highjune 댓글 2 좋아요 0 조회수 146

@Builder 생성자 private

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 좋은 강의 잘 듣고 있습니다. 다름이 아니라 Product 에서 생성자에 @Builder를 붙이시고 private 으로 선언한 이유에 대해서 알 수 있을까요? 결국 테스트에서도 @Builder 로 바로 사용하듯이 밖에서도 @Builder 를 사용할 수 있으니 private 으로 하는 어떤 의미가 있는지 궁금해서입니다 뭔가 의도로는, @Builder 생성자를 내부에서만 사용할 수 있게 private 으로 하고 of 와 같은 정적 생성자에서만 build()를 사용해서 밖에서는 정적 생성자로만 객체를 생성하도록 하는 것으로 생각했거든요. 미리 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
highjune 댓글 2 좋아요 0 조회수 164

@DisplayName gradle / intellJ

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 좋은 강의 감사합니다. 'DisplayName 을 섬세하게' 강의에서요! 설정 > Run tests using > gradle(-> intellJ) 로 변경하면 displayName 으로 뜬다고 하셨는데 기존의 gradle 로 하더라도 동일한 것 같은데 뭐가 다른가요? 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
highjune 댓글 2 좋아요 0 조회수 126

vitest 설치했는데

미해결

실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트

이렇게 발견된 테스트가 없다면서 8:39 화면처럼 테스트확장에 리스트가 출력되지않습니다.. 브랜치받고 npm ci 까지 한 상태입니다. 커서 ide 참고로 0.2.42 버전 없어서 제일낮은 0.3 버전사용해도 못찾습니다 .. Vitest v0.33.0 is not supported. Vitest v1.4.0 or newer is required. 이렇게 출려되는데 버전을 올릴까요 ?

  • javascript
  • react
  • 소프트웨어-테스트
  • vitest
댓글 2 좋아요 0 조회수 237

36:40 초 부근에 tearDown 없어도 통과하는 이유가 궁금해요

미해결

Practical Testing: 실용적인 테스트 가이드

@DisplayName("신규 상품을 등록한다. 상품번호는 가장 최근 상품의 상품번호에서 1 증가한 값이다.") @Test void createProduct() { // given Product product = createProduct("001", HANDMADE, SELLING, "아메리카노", 4000); productRepository.saveAll(List.of(product)); ProductCreateRequest request = ProductCreateRequest.builder() .type(HANDMADE) .sellingStatus(SELLING) .name("카푸치노") .price(5000) .build(); // when ProductResponse productResponse = productService.createProduct(request); // then assertThat(productResponse) .extracting("productNumber", "type", "sellingStatus", "name", "price") .contains("002", HANDMADE, SELLING, "카푸치노", 5000); } @DisplayName("상품이 하나도 없는 경우 상품을 등록하면 상품번호는 001 이다.") @Test void createProductWhenProductIsEmpty() { // given ProductCreateRequest request = ProductCreateRequest.builder() .type(HANDMADE) .sellingStatus(SELLING) .name("카푸치노") .price(5000) .build(); // when ProductResponse productResponse = productService.createProduct(request); // then assertThat(productResponse) .extracting("productNumber", "type", "sellingStatus", "name", "price") .contains("001", HANDMADE, SELLING, "카푸치노", 5000); } private Product createProduct(String productNumber, ProductType type, ProductSellingStatus sellingStatus, String name, int price) { return Product .builder() .productNumber(productNumber) .type(type) .sellingStatus(sellingStatus) .name(name) .price(price) .build(); } 강사님 화면에서는 tearDown 메소드를 추가해야지 두 메소드 모두 통과하는 것으로 나오는데, 저는 tearDown 메소드 작성 전에도 둘다 통과로 나오던데.. 뭐가 잘못된걸까요??

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
ewgregerg c 댓글 2 좋아요 0 조회수 214

Controller / Service 분리

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 선생님 강의 잘들었습니다.! 강의 이후 복습 하며 사이드 프로젝트를 하며 성장 하고 있습니다. 프로젝트를 하던중 궁금증이 생겨서 블로그 글을 찾아 보았지만 관련된 글을 찾지 못하여 질문을 드립니다. 회원 관련된 API = UserController -> UserService의 흐름으로 사용 하였습니다. 하지만 User API가 너무 많아져 특정 API를 수정할 때 찾기 어려워졌습니다. 그레서 이걸 분리 할수 없을까에 대한 고민이 생겼고 행위에 따라 분리 했습니다. [ Controller 분리 ] 검증 관련한 API를 VerficationController으로 모았습니다. VerficationController에서 필요한 자원에 따라 UserService, EventService를 사용 하였습니다. [ 질문 ] 1. Controller를 행위에 따라 부분적으로 분리 하여도 괜찮나요? UserController / EventController / VerificationController 분리 했을때 통일성이 없다는 느낌이 들어서 고민 입니다. Controller / Service 책임을 어떻게 설정 하시나요? 회원 관련된 요청이면 UserController 회원 로직이면 UserService를 사용 했습니다. 하지만 API가 너무 많아 분리를 할때 어떤 기준으로 분리를 해야 할지 모르겠습니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
조희제 댓글 2 좋아요 0 조회수 121

CQRS에 대한 jpa interface에 대한 궁금증..

미해결

Practical Testing: 실용적인 테스트 가이드

학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 우빈님! 테스트 강의 복습 중인데, 다시 들으니깐 너무 재밌네요... 다름 아니라, CQRS 에 따라서 강의를 진행하면서도 Controller와 Service를 CQRS에 따라 분리하고 있습니다. (패키지가 많아지긴하네요..ㅎㅎ..) 그런데 궁금한 부분은 Repsitory쪽인데, JpaRepository를 상속받는 인터페이스들(강의로 예를 들면 ProductRepository, StockRepository, OrderRepository가 있겠네요) 같은 경우인데, sprind data jpa 인터페이스에 CRUD 중에 CD 에 대한 책임을 줄 수는 있겠다 생각했고, U 는 변경감지에 책임을 맡기면 되겠다고 생각했습니다.. 그런데, 쿼리메서드 부분이 모호한데요. 작성했던 쿼리 메서드 같은 경우는 Query에 대한 부분인데 책임을 분리하려고보니, command에 query가 묶여있는 형태더라고요.. 이 부분은 어떻게 나누는지가 궁금합니다.. 제 짧은 지식 선에서는 QueryDSL 로 나눠야 하나 싶지만, 쿼리 메서드라는 편리한 것이 있는데 굳이 돌아가는 것 같다는 느낌이 드네요 제가 굳이 나누려는건지 싶기도 하구요... 조언을 구해봅니다..

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
쌤수 댓글 2 좋아요 0 조회수 149

DatabaseCleanup 코드입니당 필요한 분들 쓰세요

미해결

실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD

package com.clarity.productorderservice; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Table; import javax.persistence.metamodel.EntityType; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import com.google.common.base.CaseFormat; @Component public class DatabaseCleanup implements InitializingBean { @PersistenceContext private EntityManager entityManager; private List<String> tableNames; @Override public void afterPropertiesSet() { final Set<EntityType<?>> entities = entityManager.getMetamodel().getEntities(); tableNames = entities.stream() .filter(e->isEntity(e)&&hasTableAnnotation(e)) .map(e->e.getJavaType().getAnnotation(Table.class).name()) .collect(Collectors.toList()); final List<String> entityNames = entities.stream() .filter(e -> isEntity(e) && !hasTableAnnotation(e)) .map(e -> CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getName())) .toList(); } private boolean isEntity(EntityType<?> e) { return null != e.getJavaType().getAnnotation(Entity.class); } private boolean hasTableAnnotation(EntityType<?> e) { return null != e.getJavaType().getAnnotation(Table.class); } @Transactional public void execute() { entityManager.flush(); entityManager.createNativeQuery("SET REFERENTIAL_INTEGRITY FALSE").executeUpdate(); for (final String tableName : tableNames) { entityManager.createNativeQuery("TRUNCATE TABLE " + tableName).executeUpdate(); entityManager.createNativeQuery("ALTER TABLE " + tableName + " ALTER COLUMN ID RESTART WITH 1").executeUpdate(); } entityManager.createNativeQuery("SET REFERENTIAL_INTEGRITY TRUE").executeUpdate(); } }

  • tdd
  • spring-boot
  • pojo
  • 소프트웨어-테스트
  • api
유정현 댓글 1 좋아요 0 조회수 165

Rest API - 많이하는 실수 에서 복수형

미해결

Java/Spring 주니어 개발자를 위한 오답노트

회사 컨벤션마다 다르긴한데 생각보다 단수로도 많이 사용하지 않나요? 단일 데이터를 생성하는것과 여러 데이터를 생성하는 것을 구분하는 경우도 많은 것으로 알고있습니다. 실제로 naver, kakao의 많은 부서에서도 이런 컨벤션을 지키는것으로 아는데 반드시 복수형으로 쓰면 안되는것일까요? 참고 공식자료가 있을까요?

  • java
  • spring
  • 객체지향
  • 소프트웨어-테스트
댓글 1 좋아요 0 조회수 493

stubbing을 해줘야 하는 이유

해결됨

Practical Testing: 실용적인 테스트 가이드

안녕하세요 https://inf.run/QwLTR 위의 링크와 연계되는 질문입니다. 복습을 하다 보니 언제 when()으로 stubbing 을 해 줘야할까에 대해 헷갈려져서, 저의 사고 흐름을 정리해봤습니다 컨트롤러에서는 서비스 단 하위로는 모킹을 한다. 모킹하는 객체들은 테스트에서 주 관심사가 아니며, 항상 잘 동작한다고 가정한다. 모킹해오는 객체들은 stubbing을 해주지 않는다면 기본 값들을 반환하는 정책을 따른다. 위 질문 링크의 "판매 상품을 조회한다." 테스트에서는 모킹 객체인 productService의 메소드가 어떤 리턴값을 반환하든 presentation 레이어에서 검증하고 싶은 내용이 아니기 때문에, 검증을 수행하지 않았고, productService.getSellingProducts()에 대한 stubbing도 굳이 필요 없다. "메일 전송 테스트" 에서 mailSendClient.sendEmail()에 대한 stubbing이 필요한 이유 모킹 객체인 mailSendClient.sendMail()이 기본 값 반환 정책이 false이어서, 테스트 하고자 하는 mailService.sendMail()에 영향을 미치기 때문이다. (여기서 기본 값 반환 정책이 true였다면 굳이 stubbing 해주지 않아도 된다 -> "메일 전송 테스트" 에서 검증하고자 하는 대상이 아니기 때문에) 이런식으로 테스트에 검증하고자 하는 대상에 집중하다 보면 모든 동작을 제대로 stubbing했다고 보장하기 어려워 진다 -> Mockist의 치명적인 단점 제가 정리해 본 내용이 적절한지 알려주시면 감사합니다. 테스트의 세계는 정말 헷갈리네요..

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
ssshhh 댓글 2 좋아요 0 조회수 202

테스트코드 범위

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 선생님 질문이 생겨서 글 남깁니다.! 선생님이 생각하시는 가장 이상적인 테스트 코드 범위는 어디 까지인가요?? 예를들어 controller,service,repository가 있다고 가정하고 선생님 강의처럼 각각 레이어별로 테코를 짜고 service 쪽도 repo를 mock처리하여 단위테스트까지도 진행 하여야하나요? 제 질문을 정리하자면 controller,service,repository 각각 단위테스트 작성후 service + repo로 통합테스트 하는게 옳은 이상적인 범위인가 궁금합니다 감사합니다

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
wnsqud70 댓글 2 좋아요 0 조회수 182

인기 태그

인프런 TOP Writers

주간 인기글