Junit5 테스트 관련 질문있습니다.
544
24 câu hỏi đã được viết
강사님 제가 스프링부트, 스프링시큐리티, JPA로 간단한 프로젝트를 만들면서 mockmvc를 이용해 컨트롤러 쪽 테스트를 하는데 특정 메소드가 해당 메소드만 테스트를 했을 때에는 잘 수행이 되는데 해당 메소드가 속한 테스트 클래스를 전체 수행했을 때에 다른 메소드들은 다 정상 작동하는데 특정 한 메소드만 자꾸 NoSuchElementException 에러가 납니다. 혹시 이유를 알 수가 있을까요?..
Câu trả lời 6
3
안녕하세요. 박정훈님, 공식 서포터즈 OMG입니다.
.
코드를 본 것이 아니기 때문에 제가 생각하는 예상가는 점에 대해 말씀드리겠습니다.
단일 테스트 실행 시에는 테스트가 성공하나, 다른 테스트와 함께 실행 시 문제가 된다면
이전 테스트 데이터가 실패하는 테스트에 영향을 주고 있지 않나 생각합니다.
가령, A라는 테스트에서 발생한 로직(데이터 생성, 삭제 등)으로 인해 B라는 테스트의 동작에 영향을 주어 B에서 NoSuchelementException이 발생하여 실패하는 것이지 않나 생각합니다.
이 부분에서 확인해봐야 할 것은
1.테스트와 DB를 접근하는 영역에서 @Transactional이 선언되어있는지
2.@BeforeEach, @AfterEach로 다른 테스트에 영향을 주지 않고 독립적인 실행이 가능하도록 되어있는지
두 가지를 확인해보셔야 할 것 같아요.
추가)
질문 내용을 보니, 컨트롤러 관련 테스트라면 1번 보다는 2번 쪽에서 문제가 발생하지 않나 싶습니다.
.
감사합니다.
0
안녕하세요. 박정훈님, 공식 서포터즈 OMG입니다.
.
프로젝트 코드 확인해보았습니다.
처음 답변드렸던 이전 테스트의 영향이 맞네요. 해결 방안은 아래를 참고해주세요
제 pc에 mariaDB가 설치되어 있지 않기도 하고, 테스트에서 실행은 h2로도 가능하여 h2로 변경하였습니다.
build.gradle
dependencies {
runtimeOnly 'com.h2database:h2' // 추가
}test에 yml 추가

spring:
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
show_sql: true
format_sql: true
open-in-view: false
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
어노테이션 추가
@SpringBootTest
@Transactional
@AutoConfigureMockMvc
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) // 추가
class MemberControllerTest {결과

해당 어노테이션을 추가하여 해결 할 수 있습니다.
발생 이유는 아래 링크에서 설명하는 것과 동일하며, 단일 테스트에서 성공한 이유와 전체로 실행 시 실패한 이유를 확인 할 수 있습니다.
https://n1tjrgns.tistory.com/250
id로 검색하기보다는 username으로 사전 중복 검증 로직을 추가하셨으므로 이름으로 조회하여 테스트를 작성하는 것이 나을 것 같습니다.
.
감사합니다.
0
감사합니다.
링크는 아래와 같습니다.
https://drive.google.com/file/d/17aIxPGU98QP8Oj4LWcRBQ3BXoba73fAK/view?usp=sharing
파일 압축 해제 하신 다음 테스트 코드 쪽에 controller 폴더의 MemberControllerTest 를 실행시키면
edit_password_post 메소드 에서만 에러가 발생합니다. 하지만 edit_password_post 메소드 하나만 실행시키면 에러가 발생하지 않습니다.
Member 라는 테이블에 데이터가 들어있어야 하는 페이지들이 있어 @BeforeEach에 데이터를 추가하는 로직을 담았습니다. 그런데
Member 테이블을 이용하는 메소드가 join_post, edit_post, edit_password_post 인데 이 중에서 edit_password 만 혼자 실행시킬 때는 잘 작동하고 클래스 단위로 실행시키면 에러가 납니다.
0
안녕하세요. 박정훈님
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
OrderServiceTest 상문주문 테스트 시 update 쿼리 문의
0
23
1
sdk 설정 오류
0
59
2
오탈자 - @Transactional
0
58
1
src/test/resources 테스트 경로 문제
0
54
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
67
1
MemberRepositoryTest 실행오류
0
83
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
187
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
146
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
54
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
77
1
기본 생성자
0
62
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
104
1
멤버서비스테스트 부분에서 막힙니다.
0
168
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
118
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
122
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
115
1
24분 27초 연관관계 편의 메서드 위치
0
114
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
112
2
빌드 툴, Gradle
0
61
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
78
2
Repository에서 EntityManager 주입 방식 차이
0
91
1
롬복과 사용자 정의 setter 메서드
0
74
1
주문 목록 조회 fetch join 질문드립니다
0
85
1
dirty checking 질문드립니다.
0
84
1

