2014-05-12 2 views
2

싱글 톤으로 구현되었지만 stateless가 아닌 bean 때문에 코드에서 문제가 발생했습니다. 이로 인해 여러 요청 (웹 서비스)이 동시에 트리거되는 경우 예외가 발생하고 적절한 응답이 반환되지 않습니다.Junit을 사용하여 스프링 싱글 톤 구현을 테스트하십시오.

Junit을 사용하여 잡을 수 있습니까? 그렇다면 Junit을 어떻게 사용합니까? 그렇지 않은 경우 다른 대안이 있습니까?

+0

JUnit 혼자, 아니오. JUnit + Sprint Test, 아마도. –

+0

범위를 프로토 타입으로 유지해야할까요? 왜 내가 초보자인지 설명하지 않으면. –

+1

@ pathfinder2104 예, bean은 상태를 유지하므로 prototype이어야합니다. 그러나 문제는 JUnit을 사용하여 개발 단계에서이 문제가 발견되었는지 여부입니다. 그리고 대답은 프로젝트에 적용하는 통합 테스트의 종류에 달려 있습니다. –

답변

4

일단 문제가 의심되면 junit을 사용하여 문제가 실제로 발생했음을 입증 할 수 있지만 여기에 위반 된 모범 사례를 적용하는 데는 적합하지 않습니다.

"싱글 톤에는 상태가 없어야합니다."

이것은 코딩 표준 문서에서 가정에서 더 많이 사용되는 문장이며 정적 코드 분석 도구로 시행 될 수도 있습니다.

스레드가 스레드를 실행하여 동시성 문제가 발생하지 않는다는 것을 증명하려고 시도하는 것은 불가능합니다. 그렇게한다면 운이 좋으면 문제가 있다는 것을 증명할 수 있습니다. 당신은 그것을 증명하지 못할 것입니다.

모범 사례를 알고 따르고 코드를 살펴 보는 것이 더 좋습니다.

사실 저는 100 % 싱글턴 상태가 절대 없어야합니다. 그러나 그들이 할 때 그들은 스레드간에 공유되는 경우 더 나은 동기화 또는 불변해야합니다.

3

스레드를 JUnit과 함께 사용할 수 있습니다. 백그라운드 스레드 두 개를 동시에 실행하여 서비스를 동시에 호출 한 다음 주 스레드에서 서비스를 호출하고 테스트가 통과하는지 확인하십시오. 개인적으로이 접근법을 사용하여 예를 들어 테스트했습니다. (낙관적/비관적) 잠금. 그러나 이것이 대부분의 동시성 문제를 찾아내는 데있어 특히 신뢰할만한 방법은 아니라고 생각합니다.

더 나은 대안은 SoapUI 또는 JMeter와 같은 부하 테스트 도구를 사용하고 여러 동시 소비자가있는 웹 서비스를 오랜 기간 동안 호출하는 것이고 오류가 발생하는지 확인하는 것이 좋습니다.

두 경우 모두 이러한 유형의 테스트를 계획해야합니다. 예를 들어 동시성 문제가 예상됩니다.

편집 : 코드 검토 (동시성이 좋은 사람들이)는 동시성 문제를 포착하는 데 매우 효과적인 수단입니다. 정적 코드 분석은 특별한 경우에도 도움이 될 수 있지만, 나는 그걸 혼자 내놓지 않을 것이다.

관련 문제