2016-09-20 2 views
1

내 작업은 애플리케이션에서 호출 할 타사 Java 라이브러리의 스텁을 만드는 것입니다. 내 문제는 메서드 "반환 형식"(올바른 Java 용어가있는 경우) 클래스를 정의하는 것입니다. 제 3 자 API의 전체 문서에 액세스 할 수 없으며 메소드 목록 일뿐입니다. 당분간, 내 스텁은 true/false 또는 1/0, 무엇이든간에 반환해야합니다.타사 Java 라이브러리의 스텁 만들기

다음은 설명 할 방법 중 하나의 예입니다. 이것은 내가 있어야하는데 무엇 OobResponse 또는 RequestMode 아무 생각이

OobResponse RequestOobRequest(
    String ClientName, 
    String SecurityLink, 
    short LenofHHU, 
    RequestMode RequestMode) 

를 주어졌다,하지만 난 여전히 오른쪽 스텁을 생성 할 수 있어야 무엇인가?

지금까지 이것이 내가 가진 전부입니다.

public class stubber { 

    public class OobResponse { 
    public int someVar; 
    } 
    public class RequestMode { 
    public int someVar; 
    } 

    public OobResponse RequestOobRequest(
    String ClientName, 
    String SecurityLink, 
    short LenofHHU, 
    RequestMode RequestMode) 
    { 
     OobResponse oobr = new OobResponse(); 
     return oobr; 
    } 
} 
+0

나중에 'OobResponse'와'RequestMode'를 실제 클래스로 대체하겠습니까? 실제로 제 3 자 라이브러리처럼 보이지 않는 클래스를 만들 때 요점은 보이지 않습니다. – Smutje

+0

예, 현재 타사 API에 대한 액세스 권한이 없으므로 문서 만 제공하므로 사전에 많은 노력을 기울이고 있습니다. 스텁 아웃이라는 아이디어는 우리가 콜을 할 수 있음을 의미하며, (희망을 갖고) 우리가 손을 댈 때 스텁 대신에 슬롯을 꽂을 수 있습니다. 그것은 어쨌든 희망입니다! –

+0

그래서, 실제로 사용되는 데이터 유형을 모르더라도 기본적으로 API를 조롱하는 것이 무엇을 계획하고 있습니까? 가짜 클래스를 실제 클래스와 교환 한 후에이 API를 사용하여 모든 프로젝트를 컴파일해야하고 쓸모없는 코드를 만들 때 시간을 절약 할 수 있습니다. – Smutje

답변

2

을 변경할 필요가 없습니다 : 실제 Class0 사용할 수있는 경우

, 당신은 다음과 같은 방법으로, Class0Facade을 바꿀 것 메소드 이름은 camelCase를 사용하는 Java 규약을 보유하지 않습니다. 또한, 명령받은 것으로 보이는 것이 나중에 사용하지 않아도됩니다. 그러나 귀하의 문제를 이해하는 방식으로 다음을 수행 할 수 있습니다.

  • 스터 빙할 모든 클래스에 대해 새 패키지를 작성하십시오. 나중에 관련이 있습니다
  • 실제로 스텁 내용입니다. 즉, java에 내장되지 않은 문서의 모든 클래스에 대해 클래스가 작성됩니다.나는 당신이 썼던 것이 메소드 선언 (가장 감각적으로 만들어졌지만, 생성자가 될 수도 있지만 뭐든간에)이라고 가정했는데, 그것은 어떤 클래스의 일부일 필요가있다. 나는 그것을 아래의 "Unknown"이라고 불렀다. 그 이름을 실제 클래스 이름으로 대체하십시오. 귀하의 예를 들어

이 필요합니다 :

public class RequestMode { 

} 

public class OobResponse { 

} 

public class Unknown { 

    public OobResponse RequestOobRequest(
      String ClientName, 
      String SecurityLink, 
      short LenofHHU, 
      RequestMode RequestMode){ 
     return new OobResponse(); // or null, whatever since it is a stub 
    } 
} 

주, 스텁 때 (만 만 어떤 API가에 액세스 할 수 있습니다 (같은 someVar 추가 시도) 추가 변수를 생성하지 않는 것이 수업 및 공개 방법은 엄지 손가락의 좋은 규칙입니다). 클래스 대신 인터페이스를 사용할 수도 있지만, 코드는 더 깨끗합니다. 예를 들어 new StubbedClass()이 포함 된 코드를 컴파일하려는 경우에 합당한 이유가 있습니다.

이제 실제 코드 (또는 사람) 실제 라이브러리처럼 스텁을 사용할 수 있습니다 :

public class YourBusinessClass{ 

    public OobResponse getOobByClientName(String clientName){ 
     return new Unknown().RequestOobRequest(clientName,...); 
    } 

} 
  • 당신은 당신이 스텁 패키지에서 수입을 대체 할 수있는 실제 라이브러리를 얻을 때 그것을 실제 라이브러리 패키지에 사용하는 실제 코드.

그건 내가 생각할 수있는 스텁을 사용하는 유일한 유용한 방법입니다. 그래서 당신이 원하는 것입니다.

+0

좋아, 이것은 내가 쓴 것과 매우 흡사하다. 내가 너무 멀지 않았 음을 의미한다. 유일한 차이점은 RequestMode 클래스와 OobResponse 클래스를 Unknown 클래스 외부에 두었다는 점입니다. 그게 효과가 있니? –

+0

@JDor 짧게 - 예. Java에서 클래스, 내부 클래스를 처리하는 방법을 읽어야합니다. 엄지 손가락의 규칙으로, 당신이하는 일을 알지 못한다면 수업 내에서 수업을 사용해서는 안됩니다. – Deltharis

0

아마 당신이 스텁 클래스를 확장하는 클래스로 갈 수있다 : 당신이 OobResponse를 생성하지 못할 경우, 유사 공용 클래스 OobResponseStub를 만들 수

public class Stubber extends StubbedClass { 
    public OobResponse RequestOobRequest(
    String ClientName, 
    String SecurityLink, 
    short LenofHHU, 
    RequestMode RequestMode) { 
     OobResponse oobr = new OobResponse(); 
     return oobr; 
    } 
} 

을 OobResponse에게

+0

OP는 그가 가지고 있지 않은 클래스를 어떻게 확장해야합니까? 두 가지를 모두 고안하고 후에 * 두 개의 클래스를 발명 했습니까? – Smutje

+0

아, 내 대답을 쓸 때 제 3 자 라이브러리 클래스가 아직 존재하지 않는다는 것을 몰랐습니다. 물론이 방법을 사용할 수는 없습니다. –

+0

답장을 보내 주셔서 감사합니다! 나는 이해하지 못합니다 - StubbedClass는 무엇입니까? –

2

하나를 확장 가능성 (학문적으로는 최소한)은 실제 타사 라이브러리에 대한 외관을 사용하는 것입니다. 당신은 아마도 당신이 필요로하는 메소드를 가진 클래스를 만들 수 있고 메인 코드는 써드 파티 라이브러리 대신이 클래스를 호출하고, 라이브러리가 사용 가능할 때 필요한 모든 메소드를 포함하고 1/0 등을 반환한다. 정면에서 도서관에 전화.

그러나 라이브러리의 실제 데이터 모델이 복잡하면 간단한 문자열 등이 아니라면 코드에서 모든 코드 또는 해당 코드를 복제 할 수 있습니다. 이 접근 방식이 효과적입니다. 예를 엉, 내가 추가하고 아래의 코멘트를 참조

다음

우리가 클래스 있다고 가정 해 봅시다 :

public class Class0{ 

public String method0(String arg0){return "from Method 0";} 
public String method1(String arg0, String arg1){return "from Method 1";} 

}//class closing 
이제

우리가 단지에 대한 서명이 가정 해 봅시다을 클래스 자체 클래스 이상하지, 우리는 할 수있는 (지금은) 다음 코드는 'class0Facade'클래스를 사용하고 앞서 갈 수

public Class0Facade{ 

public String method0(String arg0){return "from Method 0";} 
public String method1(String arg0, String arg1){return "from Method 1";} 

}//class closing 

휴식. 당신이 문서는 변수가 있기 때문에, 이상한

public Class0Facade{ 

protected Class0 deligate; 

public Class0Facade(){delegate=new Class0();} 
public String method0(String arg0){return delegate.method0(arg0);} 
public String method1(String arg0, String arg1){return delegate.method(arg0, arg1);} 

}//class closing 

나머지 하다며 네 코드가

+0

답장을 보내 주셔서 감사합니다.하지만 저는 멍청한 행동입니다. 무슨 말씀을 하시는지 모르겠습니다. 내 질문에 정의한 RequestOobRequest 메서드를 구현하는 방법에 대한 간단한 예제를 보여줄 수 있습니까? –

+0

업데이트를 보았습니다. 많은 도움을 주신 것에 감사드립니다. 많은 감사를드립니다. –

관련 문제