@Transactional 어노테이션을 붙이지 않은 테스트가 통과하는 이유
1. 문제
HelloRepositoryTest 테스트 실행 시 findHelloFailed() 테스트 실패 및 에러 발생
Expected :null
Actual :tobyspring.hello.Hello@579846cc
2. 강의 정보
제목: [섹션 10] 스프링 부트의 자동 구성과 테스트로 전환
시간: 6:23
내용: HelloRepositoryTest.java의 @HellobootTest를 @SpringBootTest로 변경 후 실행
3. 내 프로젝트 상태
HelloRepositoryTest.java 코드
package tobyspring.hello;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class HelloRepositoryTest {
@Autowired
private HelloRepository helloRepository;
@Test
void findHelloFailed() {
assertThat(helloRepository.findHello("Toby")).isNull();
}
@Test
void increaseCount() {
assertThat(helloRepository.countOf("Toby")).isEqualTo(0);
helloRepository.increaseCount("Toby");
assertThat(helloRepository.countOf("Toby")).isEqualTo(1);
helloRepository.increaseCount("Toby");
assertThat(helloRepository.countOf("Toby")).isEqualTo(2);
}
}
4. 해결 과정
increaseCount() 테스트 실행 결과가 findHelloFailed() 테스트에 영향을 미치는 것으로 추정
따라서 @Transaction을 @SpringBootTest 아래 줄에 추가
package tobyspring.hello;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
@Transactional
public class HelloRepositoryTest {
@Autowired
private HelloRepository helloRepository;
@Test
void findHelloFailed() {
assertThat(helloRepository.findHello("Toby")).isNull();
}
@Test
void increaseCount() {
assertThat(helloRepository.countOf("Toby")).isEqualTo(0);
helloRepository.increaseCount("Toby");
assertThat(helloRepository.countOf("Toby")).isEqualTo(1);
helloRepository.increaseCount("Toby");
assertThat(helloRepository.countOf("Toby")).isEqualTo(2);
}
}
5. 결과
정상적으로 테스트 통과
6. 질문
강의에서 @Transactional 어노테이션 없이 테스트를 통과할 수 있었던 이유가 궁금합니다!
답변 2
1
날카로운, 좋은 질문을 해주셨네요. 🙂
이번 강의에선 테스트에 관해서는 깊이 들어가지 않으려고 했습니다. 그래서 말씀하신 트랜잭션, 테스트 중 DB 변경 등에 대해서 따로 언급하지는 않았네요.
강의에서 사용한 프로젝트에서는 환경설정 등에 따로 신경쓰지 않도록 간단히 인메모리 DB를 사용했습니다. 이 경우 DB 기능이 동작은 하는데 메모리에만 기록하기 때문에 애플리케이션이 종료되면 메모리에 써진 정보가 다 날라가서 DB가 초기화 됩니다. 그래서 위와 같은 테스트를 여러번 실행해도 매번 새 DB를 설치하고 사용하는 것과 동일한 효과가 생기는 것이죠. 그래서 굳이 @Transactional을 넣지 않았습니다. 만약 MySQL과 같은 DB를 연결했다면 말씀하신대로 테스트에서 추가, 변경한 정보가 다른 테스트 또는 다음 테스트에 영향을 주지 않도록 @Transactional을 붙인 롤백 테스트를 만들거나, 테스트 후에 DB 정보를 초기화하는 코드가 필요하겠네요.
아래 AI 인턴이 찾아준 질문은 강의 내용과 직접 관련은 없지만 @Transactional을 붙인 스프링의 롤백 테스트와 관련한 논쟁에 대해 여러가지 설명이 있습니다. 관심 있으면 살펴보세요.
0
안녕하세요, 인프런 AI 인턴입니다.
해당 강의 ‘토비의 스프링 부트 - 이해와 원리’에서의 @Transactional 어노테이션을 붙이지 않았을 때 테스트가 통과하는 이유에 대한 궁금증을 해결해 드리고자 합니다. 이와 유사한 경우로, 강의 수강생이 @Transactional 어노테이션 관련하여 질문하였고, 토비 선생님이 직접 답변한 내용이 있습니다. 아래의 URL을 통해 유사한 상황에 대한 선생님의 답변을 확인해 보시면 도움이 될 것 같습니다.
- 질문 제목: 테스트에서의 @Transactional 사용에 대해 질문이 있습니다.
- 링크: 테스트에서의 @Transactional 사용에 대해 질문이 있습니다.
또한 @Transactional 어노테이션의 역할과 테스트에서의 중요성에 대해서도 설명이 되어 있으니 참고하시면 좋을 것 같습니다.
다른 궁금한 점이 있으시면 언제든지 질문해 주세요.
11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지
0
75
2
TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.
0
83
1
섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)
0
200
2
WebApplicationContext를 DispatcherServlet에 this로 넘기는 것
0
278
2
인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.
0
209
2
질문드립니다.
0
232
2
spring boot 3.3.7로 학습중입니다.
0
369
2
Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도
0
162
2
spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.
1
295
2
Springboot 3.2 이상에서 파라미터 추론관련
0
913
4
binding error
0
220
3
Arrays.copyOf 메서드의 타입 세이프
1
155
2
MyOnClassCondition에 있는 matches method의 Invoke 횟수
1
231
3
인용구의 출처가 궁금합니다.
0
259
1
프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용
0
236
2
SimpleCacheConfiguration과 빈 등록
0
168
2
MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점
0
243
1
IntelliJ project jenerator spring initailizr
0
150
1
강의 자료 레퍼지토리에 업로드
0
215
1
강의자료
0
387
1
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
0
313
2
Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의
0
473
5
@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.
0
338
2
application.properties파일내 프로퍼티 이름
0
209
1





