2016-09-26 3 views
3

Site 클래스는 외부 팀에서 나에게 제공하며 개인 생성자가 있습니다.개인 생성자 조롱

public class Site 
{ 
    int id; 
    String brand; 

    private Site(int id, String brand) 
    { 
     this.id = id; 
     this.brand = brand; 
    } 
} 

(팀에 의해 제어)를 SiteUtil 클래스 따라서 조롱해야의 getSite() 기능 네트워크 통화를 필요에 그것을 논리를 적용

public class SiteUtil 
{ 
    public static Site getSite() 
    { 
    Site site; 
    //Logic 
    return site; 
    } 
} 

데이터이다. 그것은

Site mockSite = new Site(1,"Google"); 
PowerMockito.when(SiteUtil.getSite(1)).thenReturn(mockSite); 

물론 위의 코드는 내가 대중을 사용할 때 컴파일 dosent을 다음과 같이

내가 조롱 (아마도, 그래서 확실하지 않은 데이터 소스와의 일관성을 유지하기 위해) 현재 세터가 없습니다 건설자. 내가 읽은 해결책은 Site 개체의 개인 생성자를 조롱하는 것이 었습니다. 나는 그 수행하는 방법에 대한 손실에 그러나 해요

다음
+0

Java 리플렉션을 통해 개인 정보에 액세스 할 수 있습니다. – Tokazio

+0

내가 볼 수있는 코드 또는 참조로 좀 더 자세히 설명해 주시겠습니까? –

+0

부적절합니다. 이것은 끔찍한 API 디자인입니다. "외부 팀"이 조직 내에 있거나 완전히 분리되어 있습니까? – chrylis

답변

3

당신이 가정 진행할 수있는 방법입니다 만 게터를 통해 idbrand의 값 코드 액세스 (단위 테스트를 작성하는 첫 번째 시간!) :

@RunWith(PowerMockRunner.class) 
public class MyTestClass { 

    @Test 
    @PrepareForTest(SiteUtil.class) 
    public void myTest() throws Exception{ 
     Site mockSite = PowerMockito.mock(Site.class); 
     PowerMockito.when(mockSite.getId()).thenReturn(1); 
     PowerMockito.when(mockSite.getBrand()).thenReturn("Google"); 
     PowerMockito.spy(SiteUtil.class); 
     PowerMockito.when(SiteUtil.getSite()).thenReturn(mockSite); 

     ... 
    } 
} 
1

다른 접근 방법으로, 관리를 받으면 API를 호환 할 수있는 방법이 있습니다.

public class SiteUtil { 
    private static SiteLookupStrategy strategy = new DefaultSiteLookupStrategy(); 

    public static Site getSite(int siteNum) { 
     return strategy.lookup(siteNum); 
    } 

    public static void setLookupStrategy(SiteLookupStrategy strategy) { 
     SiteUtil.strategy = strategy; 
    } 
} 

이 방법은, 테스트를 위해, 당신이 당신의 자신의 (조롱) 전략을 주입 할 수 있지만, 코드의 기존 고객은 필요하지 않을 : 대신 getSite() 방법으로 네트워크 조회를 숨기는하는 SiteLookupStrategy로 그들을 외면 변경 될 수 있습니다. (이것은 또한 해당 그룹에 대해 룩업 자체를보다 쉽게 ​​테스트 할 수있는 이점이 있습니다.)

관련 문제