2010-01-12 3 views
11

내 개발 팀이 Mockito을 사용하고 있으며 '최종'으로 정의 된 클래스가 있습니다. Joshua Bloch의 Effective Java와 SO 스레드 When to use final에서 모든 클래스가 최종 수정자를 사용해야한다고 읽었습니다. 스레드에서 약간의 불일치가 있었지만 상속이 의미가 없으면 클래스 구성을 강제하는 아이디어에 동의합니다.Java 모범 사례가 Mockito와 충돌 할 때 수행 할 작업

클래스에 'final'한정자가 필요하지 않은 Mockito와 같은 테스트 프레임 워크를 사용하여 클래스를 테스트하려면 어떻게해야합니까? 다른 누군가가 개발 중에 비슷한 문제가 발생하기를 바랍니다. 개발팀이 어떤 결의안을 발표 했습니까?

JMock을 사용하거나 테스트 할 클래스에서 'final'수정자를 제거하는 것과 같은 두 가지 분명한 해답이 있지만 JUnit 외에도 하나의 외부 테스트 프레임 워크를 고수하고 다른 사람을 설득하기가 어려울 수도 있습니다 개발자가 '최종'수정자를 제거합니다.

감사합니다.

+4

모든 클래스를 '최종'으로 만드는 것이 가장 좋은 방법은 아닙니다. 효과적인 Java를 읽은 이후로 꽤 오랜 시간이 걸렸지 만 링크 된 스레드의 합의는 분명히 그 중 하나를 의미하지는 않습니다. 클래스를 final로 표시해야 확장해야하는 이유가 있음을 나타낼 수 있습니다. 이유가 없으면 불필요한 복잡성이 추가됩니다. 또한 도로를 어딘가에 확장해야 할 필요가 있다고 생각하면 원래 클래스의 코드를 변경하여 열기/닫기 원칙을 위반하는 새 클래스를 작성해야합니다. – Nate

답변

10

당신은 대부분의 무엇이 필요합니까 :

  1. 누군가가 당신의 클래스에서 상속하지 않도록 할 수있는 능력, 또는
  2. 당신의 조롱 프레임 워크를 사용하여 코드를 테스트 할 수 있는지 확인하는 기능 선택?

일반적으로 나는 (1)을 시행 할 필요가 없다고 생각합니다. 나를 위해 테스트 가능성 (2)이 훨씬 더 중요합니다. 귀하의 상황에 가장 적합한 것은 무엇입니까?

+0

테스트 가능성은 훨씬 더 중요합니다. IMHO와 나는 그것이 우리의 상황에 맞다고 믿습니다. – austen

+1

"테스트 가능성"을 위해 디자인을 희생 할 필요가 없습니다. 작업에 적합한 도구를 사용하여 두 가지 작업을 모두 수행 할 수 있습니다.이 경우 JMockit (내 도구) 또는 PowerMock (Mockito API를 지원하므로 기존 테스트를 완전히 다시 작성할 필요가 없음)과 같은 최종 메서드 및 클래스를 모의 할 수있는 Java 모킹 도구 중 하나를 사용하십시오. –

4

클래스를 최종화하려면 인터페이스를 구현하도록 할 수 있습니다. 인터페이스는 조롱 할 만하다.

4

이미 다른 답변에서 언급했듯이 인터페이스를 구현하고 인터페이스 테스트를 위해 인터페이스를 구현하는 최종 수업을 만들 수 있습니다.

이것은 모의 객체를 사용하는 이점 중 하나입니다. 이와 같은 시나리오에서는 코드를보다 체계적으로 구성하는 방법에 대해 생각하게 만듭니다. 코드베이스에 최종 클래스에 대한 참조가 많으면 (따라서 구체적인 구현에 바인딩 됨) "인터페이스에 프로그래밍"이라는 OO 원칙을 위반하며 더 나은 테스트 가능성의 필요성은 리팩토링을 생각하여 구체적인 구현에 대한 의존성을 제거하는 데 도움이됩니다.

모의의 사용에 대한 본 논문은 Endo-testing: Unit Testing with Mock Objects 객체는 인터페이스를 발견하는 데 도움이 방법을 모의 설명 인터페이스 발견라는 제목의 섹션 (4.4)가 개체.

+0

나는 인터페이스 발견의 아이디어를 좋아한다. – austen

+3

최종 클래스를 사용하는 코드를 작성하고이 클래스가 별도의 인터페이스를 구현하지 않으면 "구현 프로그램이 아닌 인터페이스에 대한 프로그램"GoF 원칙을 위반하지 * 않습니다 *. 원칙은 모든 클래스가 별도의 인터페이스를 구현하도록 요구하지 않습니다. GoF 책의 다른 부분은이를 실제로 읽으려는 사람들에게 분명합니다. –

관련 문제