2011-12-16 2 views
4

웹 프로젝트와 백엔드 프로젝트로 분리 된 Java 프로젝트에서 작업하고 있습니다. 웹은 웹 서비스 호출을 통해 백엔드와 대화합니다.유닛 테스트 웹 서비스 호출

웹 프로젝트에는 모든 웹 서비스 호출을하는 클래스가 있으며이 클래스 주위에 테스트를 추가하고 싶습니다. 기능 테스트가 아닌 단위 테스트를하고 싶기 때문에 실제로 테스트를 실행하기 위해 웹 서비스를 실행하고 싶지는 않습니다. 이 클래스가 단순히 백엔드로 호출을 전달하는 경우 테스트를 간과 할 의사가 있지만이 시점에서 캐싱이 발생하므로 제대로 작동하는지 테스트하고 싶습니다.

웹 서비스가 jax-ws wsgen으로 생성되면 프런트 엔드에서 사용하는 인터페이스가 만들어집니다. 필자는이 생성 된 인터페이스를 테스트 용 가짜 개체를 만들기 위해 사용했습니다. 이것은 잘 작동하지만이 방법에는 문제가 있습니다.

저는 현재 팀에서 단 한 건의 테스트 만하고 있으며 테스트 코드를 유지하는 유일한 사람입니다. 코드의 나머지 부분이 빌드 될 때 테스트 코드를 만들 수 있기를 바랍니다. 그러나 다른 누군가가 웹 서비스 클래스 중 하나에 새 메서드를 도입하면 인터페이스에 새 메서드가 추가됩니다. 내 가짜 물건은 그것을 구현하지 못하게 될 것이고, 그 때문에 깨질 것입니다.

웹 및 백 엔드 코드 프로젝트는 서로 종속되지 않으며 이들 사이에 종속성을 도입하고 싶지 않습니다. 그래서, 웹 서비스 엔드 포인트에 인터페이스를 도입하는 것은 그럴듯 해 보이지 않습니다. 백엔드에 넣으면 웹 코드가이를 참조해야하고 프론트 엔드에 배치하면 백엔드 코드가이를 참조해야합니다. 또한 종단점을 확장 할 수 없기 때문에 프로젝트간에 종속성이 생겨납니다.

웹 서비스가 작동하는 방법과 웹 프로젝트가 웹 서비스를 참조 할 수 있도록 클래스가 생성되는 방법에 익숙하지 않습니다. 따라서 백엔드에서 웹 프로젝트에서 사용할 수있는 인터페이스를 만드는 방법을 모르겠습니다.

그래서, 내 질문은 인터페이스를 프론트 엔드 프로젝트에서 프로젝트 종속성을 도입하지 않고 (Eclipse 빌드 경로에서) 어떻게 사용할 수 있습니까? 또는, 제가 부르고있는 백엔드 웹 서비스를 가짜로 만드는 다른 방법이 있습니까?

+0

당신은'모형 '(Mockito, JMockIt)을 찾아야한다고 생각합니다. 나는 너무 많이 사용하지 않았기 때문에 완전한 대답을 드릴 수는 없습니다. – SJuan76

+0

내 조롱을하기 위해 라이브러리를 사용하고 있지 않습니다. 저는 일반적으로 손으로 조롱했습니다 (매우 간단하기 때문에 모의 또는 가짜 개체를보다 잘 제어 할 수 있기 때문에). 필자는 단위 테스트를 수행하는 유일한 개발자이며이를 받아들이려고 사무실을 만들려고 노력하고 있으므로 가능한 한 간단하게 유지하려고합니다. –

+0

Mocking 프레임 워크 사용 권장 사항에 동의합니다. @Beckyreamy - 이것은 실제로 손을 조롱하는 것보다 훨씬 단순하게 만듭니다.20 개의 메소드 인터페이스가 있지만 하나의 메소드 만 테스트하려는 경우, 간단히 구현하십시오. 또한 이것은 원래 게시물에서 인터페이스 추가에 대해 언급 한 문제를 해결합니다. 인터페이스가 확장되면 조롱 프레임 워크가이를 처리합니다. 손을 모의한다면, 컴파일 오류가 발생할 가능성이 있습니다 (다른 프로젝트에서 손목을 업데이트하는 것을 잊지 않는 한). 나는 Mockito를 꽤 많이 사용했으며 테스트를 크게 단순화했습니다. – EJK

답변

2

먼저 캐싱 코드를 웹 서비스 호출에 직접 의존하지 않는 테스트 가능한 단위로 분해합니다.

웹 서비스의 경우 웹 서비스를 실행하는 기능 테스트와 웹 서비스를 조롱하는 다른 테스트가 모두 유용하다는 것을 알았습니다. 기능 테스트를 통해 모의 사례를 놓칠 수도 있습니다.

예를 들어 Axis2를 사용하고 WSDL에서 스텁을 생성하고 있습니다. mock 들어, 난 그냥 구현 또는 확장 생성 된 스텁. 우리의 경우 실제 웹 서비스는 외부 조직에 의해 구현됩니다. 탐색 적 기능 테스트를 통해 웹 서비스를 프로빙 한 결과 생성 된 스텁을 검사하여 명확하지 않은 몇 가지 예외 사항을 처리해야했습니다. 이 정보를 사용하여 이러한 엣지 케이스를 더욱 조롱했습니다.

+0

나는 들어가서 캐싱을 별도의 클래스 세트로 가져 가기를 원합니다. 그러나 이것은 코드 개선에 대한 내 목록에 있지만 회사에 처음 온 이후로 나에게 약간의 저항이 생겨서 이와 같이 큰 변화를 일으켰습니다. –

+0

기능 테스트를 추가 할 때도 마찬가지입니다. 나는 그 부분에 아직 빠져 있지 않았다. 회사 전체에 자동화 된 테스트를 도입하면서 단위 테스트 개념을 기능 테스트와 혼동하지 않도록 조금 더 천천히 노력하고 있습니다. –

+1

코드를 테스트 할 수있는 권한을 요청하지 않습니다. 그것은 나의 전문적인 책임의 일부입니다. –