작성
·
339
·
수정됨
0
synchronized를 이용해서 동시성 이슈를 해결한 후
StockServiceTest를 실행 했을 때 왜 둘 중 하나의 테스트가 실패하는지 궁금합니다.
테스트 메소드 각각 따로 실행하면 각자 성공하는데, 함께 실행하면 둘 중 하나의 테스트가 실패합니다.
실패 시 다음과 같은 에러가 발생합니다.
java.lang.NullPointerException: Cannot invoke "com.example.stock.domain.Stock.decrease(java.lang.Long)" because "stock" is null
@BeforeEach, @AfterEach로 테스트 실행 전 Stock을 저장/삭제를 하고 있기 때문에 함께 실행해도 문제 없을 것으로 생각되어 질문 남깁니다.
답변 2
0
김지원님 안녕하세요.
단순히 글 내용만으로 원인을 유추하기는 힘들 것 같습니다.
혹시 소스를 깃헙에 올리신 후에 공유해주실 수 있으실까요 ?
공유해주시면 소스를 보고 원인을 파악해보도록 하겠습니다!
감사합니다
0
안녕하세요, 인프런 AI 인턴입니다.
synchronized를 활용하여 동시성 문제를 해결한 후에 발생하는 StockServiceTest
의 테스트 실패 문제는 여러 가지 원인이 있을 수 있습니다. 해당 테스트 케이스들이 따로 실행될 때 모두 성공하지만, 함께 실행되었을 때 특정 테스트가 실패하는 경우, 다음과 같은 이유들을 고려해볼 수 있습니다.
공유되는 자원의 상태가 테스트 간에 영향을 주고 있을 수 있습니다. 테스트가 공유되는 객체나 데이터베이스, 파일시스템 등에 의존하고 있다면, 한 테스트의 실행이 다른 테스트에 영향을 미칠 수 있습니다.
JUnit은 기본적으로 각 테스트 메서드마다 새로운 인스턴스를 생성합니다. 하지만 static 변수나 싱글턴 패턴으로 구현된 인스턴스는 모든 테스트에 걸쳐 상태를 공유합니다. 이러한 상태 공유가 문제의 원인일 수 있습니다.
@BeforeEach
나 @AfterEach
가 제대로 동작하여 각 테스트 이전과 이후의 상태를 제대로 초기화하고 정리하는지 확인이 필요합니다.
synchronized
키워드가 사용된 메서드나 블록이 올바르게 동기화를 하고 있는지, 혹은 데드락(deadlock)과 같은 다른 동시성 문제를 발생시키지 않는지 점검이 필요합니다.
비동기 코드나 별도의 스레드를 사용하는 경우, 스레드 간의 동기화 이슈가 발생할 수 있습니다. 특히, 별도의 스레드에서 실행되는 로직이 테스트 실행 시점과 정확히 맞물려서 실행되도록 동기화하는 것이 필요할 수 있습니다.
에러 메시지 java.lang.NullPointerException: Cannot invoke "com.example.stock.domain.Stock.decrease(java.lang.Long)" because "stock" is null
는 stock
객체가 null
상태이기 때문에 메서드를 호출할 수 없다고 나타내고 있습니다. 이는 stock
객체의 초기화가 제대로 이루어지지 않았거나, 테스트 실행 도중에 해당 객체가 null
로 변경되었을 가능성이 있습니다.
테스트가 실패하는 문제를 해결하기 위해서는 다음 단계를 고려해보시기 바랍니다.
stock
객체가 올바르게 생성되고 초기화되는 과정을 점검해보세요.synchronized
가 올바르게 적용되고, 다른 테스트와의 동기화에 문제가 없는지 검토해보세요.테스트가 실패한 경우와 성공한 경우에서 로그 또는 디버깅을 통해 stock
객체의 상태를 추적하며, @BeforeEach
및 @AfterEach
가 예상대로 동작하는지도 확인해보시면 원인 파악에 도움이 될 것입니다.
참고로, Spring Boot에서 테스트 관련 문서를 보고자 하신다면 아래의 링크를 확인하실 수 있습니다. 추후 이와 관련된 더 자세한 정보를 확인하고 싶으시다면 해당 문서를 참조하시면 좋을 것 같습니다.
위 내용을 바탕으로 문제를 해결해 보시기 바랍니다.