2013-02-28 2 views
3

모의하고 싶은 써드 파티 컴포넌트가 있지만, 복잡한 계층 구조를 갖는 클래스를 리턴하고, 인터페이스 중 일부는 API에서 사용할 수없는 일부 클래스로 초기화 된 정적 필드를 가지고있다. 나는 숨겨진 수업에서 무엇이든 필요하지 않습니다.의존성이없는 모의 클래스

샘플 : Combo를 구현하는 MutableCombo 클래스를 모의한다고 가정 해 보겠습니다. 그러나 인터페이스 콤보에는 Breaker로 초기화 된 필드가 있습니다. 차단기는 구현 패키지의 일부이며 컴파일 및 테스트 중에 개발자가 액세스 할 수 없습니다.

public interface Combo{ 
    String FUU = Breaker.getFoo(); 
    String BAR = Breaker.getBar(); 
} 
public class MutableCombo implements Combo; 

나는 MutableCombo 작업 내 수업을 테스트 할 수 있지만

java.lang.NoClassDefFoundError: Breaker 
    at Combo.<clinit>(Combo.java:36) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
+0

'구현 패키지의 일부'란 무엇을 의미합니까? – CAMOBAP

+0

타사 구성 요소를 사용합니다. 구성 요소에는 2 부분으로 된 API 및 구현 패키지가 있습니다. 개발자로서 컴포넌트의 API 부분 만 사용할 수 있습니다. – ainlolcat

답변

3

당신은 여기 어댑터가 필요합니다 때문에 조롱 수 없습니다. 자신이 소유하지 않은 유형을 조롱해서는 안됩니다. 구현 세부 사항으로 MutableCombo을 처리하십시오. 예 :

public class ExampleMutableCombo implements IExampleMutableCombo 
{ 
    public String DoFoo() 
    { 
     return Breaker.getFoo(); 
    } 

    public String DoBar() 
    { 
     return Breaker.getBar(); 
    } 
} 

코드 사용 IExampleMutableCombo. 이 인터페이스는 이제 귀하의 것입니다. 프로덕션 코드에서이를 사용하십시오. 이 인터페이스를 소유로서 당신은이 역할을 조롱 할 수 있습니다 - 당신은 같은 테스트하기 위해 가짜 콤보를 소개 할 수 있습니다 생산 코드의 사용을 할 수 있지만, 지금은 모든 시험은 밖으로 스텁 클래스로 작업 할 수 있습니다

public class FakeExampleMutableCombo implements IExampleMutableCombo 
{ 
    public String DoFoo() 
    { 
     return "Foo"; 
    } 

    public String DoBar() 
    { 
     return "Bar"; 
    } 
} 

ExampleMutableCombo. 핵심은 유형이 아닌 "인터페이스에 코드화"하는 것입니다.

+0

기본적으로하겠습니다. 하지만 성가시다. 나는 약간의 무력의 해결책이 있기를 바랐다.) 그러나 대답에서 보았 듯이, 그렇지 않다. – ainlolcat

+0

@ainlolcat 성가신 느낌이 들지만, 이것은 좋은 습관입니다. 제 3 자 코드를 시스템 가장자리까지 밀어 넣으십시오. 귀하의 도메인이 초점이어야합니다. 나머지 부분은 당신이 기대하는 인터페이스를 따르고 있다면 당신이 자유롭게 바꿔야 할 세부 사항입니다. 귀하의 예를 들어 Breaker를 가져 가면 MyBreaker로 전환 할 수 있습니다. 푸 (Foo)와 바 (Bar)를 뱉어 내면 나머지 앱은 신경 쓰지 않습니다. 이제 Breaker를 Database 또는 WebService로 교체하면 사소한 노력으로 프로그램을 변경할 수있는 강력한 기능이 있습니다. – Finglas

관련 문제