inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

혹시 git 플러그인 아시는 분

미해결

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

수업에서 git 커밋메세지 사용할 때 옆에 나오는 것들 어떻게 나오는지 아시는 분 계시나요? intellij 기능인지 플러그인인지 인 것 같은데요. 아시는 분 있으시면 답변 주시면 감사하겠습니다.

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

이상한 url로 요청해도 200이 반환됩니다. 그리고 body가 비어있어요...

미해결

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

@WebMvcTest(CompanyController::class) @ActiveProfiles("test") @WithMockUser class CompanyControllerTest { @Autowired lateinit var mockMvc: MockMvc @MockBean lateinit var getCompanyService: GetCompanyService @MockBean lateinit var adminAuthorizationFilter: AdminAuthorizationFilter private val cookie = Cookie(ADMIN_AUTH_TOKEN, "admin-auth-token") @DisplayName("회사 목록 조회") @Test fun findAll() { // given val companies = listOf( companyEntity(1, "A"), companyEntity(2, "B"), companyEntity(3, "C"), ) `when`(getCompanyService.findAll()).thenReturn(companies) // when val request = MockMvcRequestBuilders.get("/admin/api/v1/companies") .cookie(cookie).accept(MediaType.APPLICATION_JSON) // then mockMvc.perform(request) .andExpect(MockMvcResultMatchers.status().isOk) .andDo(MockMvcResultHandlers.print()) } } 위 코드를 가지고 질문드리겠습니다. val request = MockMvcRequestBuilders.get("/admin/api/v1/companies") 이 부분에서 companies가 아니라 존재하지 않는 url(ex. /admin/api/v1/cfasfsdfcompanies )라고 한 후 위 코드를 돌리면 200나옵니다. 존재하지 않는 url도 호출이 가능한건가요? 그리고 body가 항상 빈 값입니다. MockHttpServletResponse: Status = 200 Error message = null Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"] Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = [] 목킹이 잘못되었는지 점검해보려고 getCompanyService.findAll() 를 호출해보았는데 3개가 정상적으로 나옵니다. 혹시 몰라 소스 공유드립니다. // controller @RestController @RequestMapping("/admin/api/v1/companies") class CompanyController( private val getCompanyService: GetCompanyService ) { @GetMapping fun findAll(): List<CompanyResponse> { return getCompanyService.findAll().map { CompanyResponse.of(it) } } } // service @Service @Transactional(readOnly = true) class GetCompanyService( private val companyFindService: CompanyFindService ) { fun findAll(): List<CompanyEntity> { return companyFindService.findAll() } }

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
Louie(루이) 댓글 2 좋아요 0 조회수 927

RestDocs에서의 SpringSecurity Issue

미해결

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

public class FollowControllerDocsTest extends RestDocsSupport { private FollowService followService = mock(FollowService.class); @Override protected Object initController() { return new FollowController(followService); } private final Long loginUserId = 1L; @DisplayName("팔로우 수행 API") @WithUserDetails @Test public void startFollow() throws Exception { // Given StartFollowRequestDto requestDto = StartFollowRequestDto.builder() .followerId(loginUserId) .followingId(123L) .build(); BDDMockito.doReturn(StartFollowResponseDto.success()) .when(followService) .follow(any(StartFollowRequestDto.class)); //when,then mockMvc.perform( post("/api/follow/start-follow") .with(csrf()) .content(objectMapper.writeValueAsString(requestDto)) .contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk()) .andDo(document("start-follow", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields( fieldWithPath("followerId").type(JsonFieldType.STRING) .optional() .description("팔로워 아이디"), fieldWithPath("followingId").type(JsonFieldType.STRING) .optional() .description("팔로잉 아이디") ), responseFields( fieldWithPath("code").type(JsonFieldType.STRING) .description(ResponseCode.SUCCESS), fieldWithPath("message").type(JsonFieldType.STRING) .description(SUCCESS) ) )); } } FollowController @RestController @RequestMapping("/api/follow") @RequiredArgsConstructor public class FollowController { private final FollowService followService; @PostMapping("/start-follow") ResponseEntity<? super StartFollowResponseDto> startFollow( @RequestBody @Valid StartFollowRequestDto requestBody, @AuthenticationPrincipal PrincipalDetails principalDetails ) { Long loginId = principalDetails.getUser().getId(); Long userId = requestBody.getFollowerId(); if (loginId != userId) return StartFollowResponseDto.certificationFail(); ResponseEntity<? super StartFollowResponseDto> response = followService.follow(requestBody); return response; } } RestDocsSupport @ExtendWith(RestDocumentationExtension.class) public abstract class RestDocsSupport { protected MockMvc mockMvc; protected ObjectMapper objectMapper = new ObjectMapper(); private final Long loginUserId = 1L; @BeforeEach void setUp(RestDocumentationContextProvider provider) { User user = mock(User.class); when(user.getId()).thenReturn(loginUserId); PrincipalDetails userDetails = mock(PrincipalDetails.class); when(userDetails.getUser()).thenReturn(user); SecurityContext context = SecurityContextHolder.getContext(); context.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, null, null)); this.mockMvc = MockMvcBuilders .standaloneSetup(initController()) .apply(MockMvcRestDocumentation.documentationConfiguration(provider)) .build(); System.out.println("beforeEach 수행"); } protected abstract Object initController(); } 안녕하세요. 강의 정말 유익하게 잘 듣고있습니다. 강의를 듣고 restdocs를 작성하던 중 문제가 발생하여 질문을 올립니다. 제가 작성한 controller에서는 파라미터로 security.context 안에 있는 PrincipalDetails를 받아옵니다. 그렇지만 테스트에선 그 안에 값이 있는게 아니여서 Mock값을 넣어주어 @WebMvcTest 에서는 문제를 해결해 왔었습니다. 문제는 restdocs를 작성하기 위한 테스트 코드에서 발생하였습니다. 이 테스트 코드에는 제가 적용한 PrincipalDetails 몫 이 넣어지지 않는 문제가 있었습니다. 제가 생각하기론 SpringSecurity가 올라가지 않아서 그런 것 같은데 해결방법이 있으면 알고싶습니다 !

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
김승수 댓글 2 좋아요 -1 조회수 611

패키지 구조에 대해서 질문 드리고 싶습니다.

해결됨

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

강의 너무 잘들었습니다 강사님 :) 도움 너무 많이 되고있습니다 “ 패키지 구조에 대한 질문 이라는 글을 읽고서 product 패키지 -domain 패키지 -service 패키지 -repository패키지 아니면 controller패키지 -product패지지 service패키지 -product패키지 어떤게 더 나을지 고민입니당 ㅠ 어떻게 생각하시나요? rest api 서버로 프로젝트를 처음 진행하려고 하는데 어떻게 나눌지를 잘 모르겠어서 검색 키워드나 실무에서는 어떻게 사용하시는지 궁금합니다 ..

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

패키지 의존성을 확인해보는법?

미해결

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

해당 챕터를 들고 궁금한 점이 있어 문의를 남깁니다. 7분를 들어보면 패키지 의존성을 확인해보라는 말이 나오는데 그런 의존성을 파악하는 툴 같은게 있는건가요?

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
JH_DEV77 댓글 2 좋아요 0 조회수 1638

중첩 라우트

미해결

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

그럼 중첩 라우트는 인클루드 개념 인거겠네요?

  • react
  • redux
  • tdd
  • typescript
  • next.js
  • 소프트웨어-테스트
악보-Designer Park 댓글 1 좋아요 0 조회수 214

환경변수 관련되서 여쭤볼게 있습니다~

미해결

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

mock 테스트 중에 환경변수(@Value)를 가져와야하는데, @SpringBootTest가 아니라서 환경변수를 못가져오고 있습니다. 그래서 환경변수를 담은 변수가 null이 나오기 때문에 테스트를 못하고 있는데, 이럴 경우 어떻게 하시나요?? 일단 환경변수 대신, 생성자를 통해 해당 변수들을 받는 형태로 리펙토링했는데, 프로덕션 코드들을 테스트에 맞추는 거 같아서 약간 딜레마가 오고있어요. 선생님께서는 이런 경우 어떻게 하시나요? 1. 환경변수 이슈 2. 프로덕션 코드를 테스트코드에 맞추는 리펙토링 (2번은 수업에 있네요 ㅎㅎ)

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

TestFixture에 질문이 있습니다.

해결됨

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

테스트에서 사용하는 빌더 매서드를 한 곳에 모아놓으면 오히려 유지보수가 어렵고 매번 새롭게 만들게 된다고 하셨습니다. 그리고 매서드를 만들때 테스트 검증이나 테스트에 필요한 인수만 외부로 들어내서 테스트의 목적을 명확하게 들어내는게 좋다고 하셨는데 만약 테스트 케이스마다 외부로 들어내는게 제각각 다른 경우에 하나의 테스트 클래스에 다양한 빌더 매서드들이 생기게 된다면 그것도 관리하는데 어려움이 발생할 거라 생각합니다. 이런 경우에는 하나의 빌더 매서드만 생성해서 사용하시나요 ? 아니면 그렇게 많이 발생할 일이 없기 때문에 매번 테스트에 필요한 빌더 매서드들을 만드시나요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
티벳로보 댓글 2 좋아요 1 조회수 286

도메인 객체와 영속성 객체를 구분하게 되면

미해결

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

도메인 객체와 영속성 객체를 구분하게 되면 비즈니스 로직을 짤때 JPA에서 제공해주는 기능들을 사용하지 못할거 같은데 제가 이해한 방식들이 맞나요?? 예를들어 User의 update 메소드를 확인해보면 기존 JPA에서 repository로 영속성 객체를 가져와서 값을 수정하는 방식이 아닌 완전히 새로운 User 객체를 생성하고 repository로 save 하는 방식으로 구현을 하시길래 그러면 JPA에서 영속성 객체들 끼리 단방향 매핑이나 양방향 매핑을 구현한 객체들은 도메인 객체로 어떻게 연결지어야할지 감이 안잡히네요..

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
돈우 댓글 3 좋아요 0 조회수 1826

스프링 부트 3.x 질문

미해결

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

현재 스프링 부트가 3.x 이상만 지원하고 있는데 자바 17 스프링 부트 3.x 최신버전으로 들어도 문제 없을까요??

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

ServiceRequestDto 대신 풀어서 넘기는건 어떻게 생각하시나요?

해결됨

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

Controller단의 Dto를 Service 전용 Dto로 변환해서 넘기는 방법을 알려주셨는데 Controller단에서 받은 Dto의 컬럼들을 모두 풀어서 Service단 으로 넘겨주는 방법은 어떻게 생각하시는지 궁금합니다. 이렇게 하면 순수한 자바코드로 Service단 코드를 작성할 수 있을 거라고 생각하는데 강사님의 생각 알려주시면 감사하겠습니다.

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

Spring Rest Docs 강의 질문이 있습니다.

해결됨

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

0:59:00 전 내용입니다. 명세를 정한다 컨트롤러 @Valid 검증을 작성한다. RestDocs 를 작성한다 가짜 데이터를 넣는다. 배포한다. 그 뒤 서비스와 리포지토리를 작성한다. 라고 정리를 해봤습니다. 그런데 여기서 궁금한게 4번인데요 가짜 데이터를 넣는다는 뜻을 잘 모르겠습니다. 테스트 환경에서는 자유롭게 docs/index.html 로 접근을 하고 라이브 환경에서는 해당 bootJar를 구문을 제거하고 배포하시는 건가요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
티벳로보 댓글 2 좋아요 0 조회수 447

MailService 구조에 대해 생각을 여쭙고 싶습니다.

해결됨

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

안녕하세요 강사님, 먼저 좋은 강의와 강의가 나온지 일년이 가까지 되어가는데도 답변해주셔서 감사합니다. public boolean sendOrderStatisticsMail(LocalDate orderDate, String email) { // 찾아오기 //통계 합산하기. boolean result = mailService.sendMail(); return true; } public Boolean sendMail(String fromEmail, String toEmail, String subject, String content) { // mailSendClient는 메일을 전송하는 역할을 합니다. boolean result = mailSendClient.sendEmail(fromEmail,toEmail,subject,content); // 메일이 전송되었다면 메일 전송 내역을 저장합니다. - 기록용 엔티티 입니다. if (result) { mailSendHistoryRepository.save(..); return true; } return false; } 이렇게 역할을 나누어 메일 전송을 메일 서비스에게 위임했습니다. 조회한다 메일을 전송한다 메일 히스토리에 저장한다. 비즈니스 로직을 그대로 작성하다보면 아래와 같이 작성하게 되는 경우가 많습니다. public boolean sendOrderStatisticsMail(LocalDate orderDate, String email) { // 찾아오기 //통계 합산하기. // mailSendClient는 메일을 전송하는 역할을 합니다. boolean result = mailSendClient.sendEmail(fromEmail,toEmail,subject,content); // 메일이 전송되었다면 메일 전송 내역을 저장합니다. - 기록용 엔티티 입니다. if (result) { mailSendHistoryRepository.save(..); return true; } return false; } mailSendClient를 Subbing해서 테스트를 한다면 위에 코드나 아래 코드나 테스트 방식은 동일하게 작성이 됩니다. 강사님께서 작성하는 방법은 메일 후처리를 해주는 클래스를 추가가 됩니다. 테스트 코드를 작성하면 동일하게 동작하는데 클래스가 하나가 추가됩니다. 그럼에도 장점이 있기 때문에 사용한다고 생각되어지는데 제가 생각한 후처리기 클래스의 장점은 외부 네트워크를 직접 의존하지 않아도 된다. 메일 전송과 히스토리 저장을 하나의 서비스로 사용할 수 있다. 그리고 이렇게 후처리기 클래스 적용하는 기준이 있으실까요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
티벳로보 댓글 1 좋아요 0 조회수 290

테스트 코드 오류

미해결

Do It! 장고+부트스트랩: 파이썬 웹개발의 정석

안녕하세요 선생님, 좋은 강의 항상 감사하게 잘 듣고 있습니다. 제가 지금 카테고리를 테스트 하는 강의를 수강하고 있습니다. 그런데 아무리 테스트를 하여도 blog/ test.py 83번째 줄에서 Nonetype 오류가 나옵니다. id를 제대로 html에 부여 하였고 대문자, 소문자, 특수기호를 모두 확인하였습니다. 그래서 제 지식으로는 오래 생각을 해 보아도 틀린 부분을 찾을 수 없어서 어느 부분이 틀린 부분인지 선생님께 여쭤보고자 연락을 드립니다. 아래 제 깃허브 url을 첨부하도록 하겠습니다. 감사합니다. https://github.com/rapgodd/django_2023.git

  • HTML/CSS
  • javascript
  • python
  • django
  • bootstrap
  • aws
  • docker
  • tdd
최기연 댓글 2 좋아요 0 조회수 458

섹션 6-2 알림 내용 중 링크가 잘못되어 있네요.

해결됨

Do It! 장고+부트스트랩: 파이썬 웹개발의 정석

안녕하세요 섹션 6. 정적파일 (static files) & 미디어 파일 (media files) - 정적파일 관리하기 - 블로그 포스트 상세 페이지에 부트스트랩 적용하기 을 듣고 있습니다. 거기서 1:31 경, Bootstrap 관련 링크가 수정되었다고 알림이 뜨는데, 그 링크가 잘못되어있습니다. 그 링크를 이용하면, post list 를 카피하게 됩니다. Post detail을 이용하기 위해서는 아래 링크를 사용해야 합니다. https://github.com/StartBootstrap/startbootstrap-blog-post/tree/18e5cfdfb75bc7b06fbb8b04b7d957e0395fe8cc 확인 후 수정 부탁드립니다. 감사합니다.

  • HTML/CSS
  • javascript
  • python
  • django
  • bootstrap
  • aws
  • docker
  • tdd
smile.jisoo 댓글 2 좋아요 0 조회수 336

이런 경우는 어떻게 테스트 해야할까요?

미해결

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

지금 토스페이먼트 결제를 연동하고있는데 토스에서 결제 요청-인증을 하면 토스에서 주소에 파라미터로 paymentKey을 주는데 이 paymentKey을 가지고 백엔드에서 토스의 api에 결제 승인 요청을 해야합니다. 그런데 서비스 단에서는 컨트롤러에서 파라미터을 통해 paymentKey을 알 수 있지 서비스단의 테스트 코드 작성 시는 paymentKey을 알 수 가 없는데 이런 경우는 테스트 코드를 어떻게 작성해야할까요? 추가적으로 외부 api 에서 paymentkey을 파라미터로 주는 컨트롤러는 어떻게 테스트해야할까요?

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

테스트 given 중 연관 관계 / 참조키

미해결

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

안녕하세요. 강의 잘 들었습니다 ! 강의 수강 후 제가 진행했던 프로젝트에서 테스트 코드를 작성해보고 있는데 엔티티들의 연관 관계에 대해서 궁금한게 생겨서 질문 드립니다. 강의에서 Order의 create를 테스트하기 위해 Product를 먼저 생성 후 DB에 저장하는 것과 비슷하게, 커뮤니티의 게시글이라면, 게시글(Board)과 작성자(User)는 엔티티에서 연관 관계가 설정되어 있고 Board 테이블에는 User의 PK가 참조키로 설정해야할 때, given에서 User 엔티티도 DB에 save 후 저장된 User를 Board가 참조하도록 테스트 코드를 작성하는게 맞을까요 ? 제가 궁금한 것은, 실제 서비스라면 엔티티들은 수많은 연관 관계가 있을텐데 한 엔티티의 비즈니스 로직 등을 테스트하기 위해, 그 엔티티와 연관 관계에 있는 다른 엔티티들을 모두 given 절에서 생성하고 DB에 저장해야 하는지 궁금합니다. 감사합니다 !

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

LocalDateTime.now() 를 검증하는 테스트에 관하여

미해결

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

안녕하세요. LocalDateTime.now () 를 이용하여 테스트 하는 걸 지양하자라는 강사님 강의 중에 제가 겪었던 경험에 대해 질문이 있습니다. 현재 개인적인 프로젝트에서 테스트 코드를 작성하고 있습니다.회원가입을 할때 가입한 시점을 저장하기 위해 LocalDateTime 을 파라미터로 받고 있는데요, 이 로직을 검증하기 위해 테스트 코드를 작성하였습니다. 그러나 아래와 같은 에러가 발생하더라구요 org.opentest4j.AssertionFailedError: expected: 2024-01-03T21:25:11.333406800 (java.time.LocalDateTime) but was: 2024-01-03T21:25:11.333407 (java.time.LocalDateTime) when comparing values using 'ChronoLocalDateTime.timeLineOrder()' Expected :2024-01-03T21:25:11.333406800 (java.time.LocalDateTime) Actual :2024-01-03T21:25:11.333407 (java.time.LocalDateTime) 대략 에러 메세지를 확인해보니 LocalDateTime.now 로 생성한 값과 저장한 뒤에 조회한 시간의 오차가 발생하여 테스트가 실행하는 것 이었습니다. 해서 LocalDateTime.now 가 아닌 임의의 시점을 지정해주어서 문제를 해결할 수 있었는데 혹시 비슷한 경험을 하신적이 있으신지? 있으시다면 제가 말한 방법대로 테스트 코드를 작성하는게 적절한지? 가 궁금합니다! 감사합니다!!

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

모듈간끼리 연관성있는 것들에 대해 어떻게 설계를 해야 할까요?

미해결

견고한 JS 소프트웨어 만들기

우선 이번 강의를 통해 기존의 DOM을 단순조작하는 코딩에서 벗어날 수 있는 생각을 갖게 되어 너무 감사드립니다. 무엇보다도 짜임새 있는 설계와 유지 보수가 가능할 수 있는 코드를 만들수 있을 것 같아 이번 강의를 통해 많은 생각을 할 수 있게 되어 감사합니다. 강의 들으면서 한 가지 질문이 생겼는데요 만약에 모듈 간 영향력이 있는 경우는 어떻게 설계를 가져야 할까요? 예를 들어 ClickCount의 예제에서 확장해서 + - 버튼을 클릭하면 옆에 특정 모듈에서 총 클릭 수를 보여주는 totalClickCount와 totalClcikCountView 를 만들어 사용한다고 한다면 어떻게 설계해야 할까요? 대부분의 실생활 로직들이 모듈간의 서로 영향력을 주고 받는 일이 비일비재한 이런부분 에서 어떻게 설계해야 하는지 질문 드립니다.

  • tdd
  • 소프트웨어-테스트
  • jasmine
노트북은맥북이지 댓글 1 좋아요 1 조회수 340

UUID, Random 등 자주 사용하는 의존성의 경우

해결됨

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

UUID, Random 등 자주 사용하는 의존성의 경우, 강의에서 설명해주신 방식으로 공통으로 사용하는 유틸성 Holder 인터페이스를 만들어놓고 프로젝트에서 함께 사용하는 방식으로 개발하나요? 자주 사용되는 클래스들이다 보니 여러 곳에서 필요할 것 같은데(한 곳에서 Holder 인터페이스를 만들어두면 될 것 같은데) 실제로는 어떻게 사용하시는지 궁금해서 여쭙습니다.

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
beSlow 댓글 2 좋아요 0 조회수 863

인기 태그

인프런 TOP Writers

주간 인기글