2014-10-31 2 views
1

안녕하세요 generateKey 메서드 및 Dispatcher에 의해 발송되는 메시지를 테스트하고 싶습니다. 나는 클래스와 public 메소드 verifyOtherDetails()를 조롱했다. 그 안에는 dispatcher 메소드가 리터럴 값을 가졌지 만 항상 전달된다는 기대가 생겼습니다. 어떤 도움을 주시면 감사하겠습니다.개인 정적 메서드 테스트

시도해 주신 코드 감사합니다.

abstract class KeyGen { 

    private static void generateKey(String key, String username){ 
    if(Strings.isNullOrEmpty(key)){ 
     Dispatcher.dispatch(new WarningString(String.format("The key is null or empty for user %s", username))); 
    }else{ 
     Dispatcher.dispatch(new InfoString(String.format("The key is correct for user %s", username))); 
    } 
    } 

    public void verifyOtherDetails(String address, Map<String, String> favouriteFilms){ 
    String key =""; 
    String username =""; 
    generateKey(key, username); 
    } 
} 

public class TestKeyGen { 

    @Test 
    public void testKey() { 
    new MockUp<KeyGen>() { 
     @Mock() 
     public void verifyOtherDetails() { 

     String key = "sfjhlkjhfkjdhlsk"; 
     final String username = "Daniel"; 
     new Expectations() { 
      { 
      Dispatcher.dispatch(new WarningString(String.format("The key is null or empty for user %s", username))); 
      } 
     }; 
     } 
    }; 
    } 
} 
+2

Google의 톱 히트를 포함하여 [SO에 대한 다른 답변 (http://stackoverflow.com/questions/34571)을 포함하여] 이미 개인적인 방법을 테스트하는 데있어 많은 자료가 있습니다. [ 이 질문의 제목] (https : // www .google.com/webhp? ion = 1 # q = 테스트 % 20a % 20private % 20Static % 20method). 그 사람들이 당신의 질문에 대답합니까? – yshavit

+0

나는 반사의 사용을 보았지만 그 방법을 검증하는 더 깨끗한 방법이 있는지 알고 싶었다. 나는 JMockit을 처음 사용하고 객체 조롱에 대한 많은 경험이 없습니다. –

답변

2

귀하의 디자인을 감안할 때 귀하의 방법을 테스트하기가 어렵다고 말하고 싶습니다. 기본적으로 Dispatcher 클래스의 정적 메서드를 사용하므로 쉽게 모방 할 수 없기 때문입니다.

당신은 옵션의 쿠페를 가지고있다. 테스트에서 디스패처 메시지를 구독하고 예상 메시지가 도착하는지 확인할 수 있습니다. 이것은 가장 덜 침략 적이며 통합 테스트 역할을합니다.

다른 옵션은 인터페이스에서 Dispatcher 정적 호출을 래핑하고이 인터페이스의 모의 객체를 KeyGen 클래스에 삽입 한 다음 공용 메소드를 통해 인터페이스의 메소드가 호출되는지 테스트하는 것입니다.

public interface DispatchWrapper{ 
    void dispatch(IString stringToDispatch); 
} 

public class StaticDispatcher : DispatchWrapper{ 
    void dispatch(IString stringToDispatch) 
    { 
      Dispatcher.dispatch(stringToDispatch); 
    } 
} 

abstract class KeyGen { 
    private DispatchWrapper wrapper; 

    public KeyGen(DispatchWrapper wrapper){ 
     this.wrapper = wrapper; 
    } 
    private static void generateKey(String key, String username){ 
    if(Strings.isNullOrEmpty(key)){ 
     wrapper.dispatch(new WarningString(String.format("The key is null or empty for user %s", username))); 
    }else{ 
     wrapper.dispatch(new InfoString(String.format("The key is correct for user %s", username))); 
    } 
    } 

    public void verifyOtherDetails(String address, Map<String, String> favouriteFilms){ 
    String key =""; 
    String username =""; 
    generateKey(key, username); 
    } 
} 

세 번째 옵션은 다른 정적 클래스에 private 메소드를 이동하고 공공, 다음 (정적 디스패처와 같은 문제) 클래스를 테스트 할 수 있도록하는 것입니다. 그런 다음 KeyGen 클래스는 VerifyingKeyGen이되어 실제적으로 키를 생성하는 다른 방법을 위임 한 것입니다. WarningString를 제공

@Tested KeyGen keyGen; 
@Mocked Dispatcher dispatcher; 

@Test 
public void testKey() { 
    keyGen.verifyOtherDetails("???", null); 

    final WarningString warning = 
     new WarningString("The key is null or empty for user "); 

    new Verifications() {{ Dispatcher.dispatch(warning); }}; 
} 

합니다 (equals 방법을 구현이 멋지게 즉, 당신이 가지고있는 2 문제, 새로운 키를 생성하고 검증 deatils

질문에서 시험
public static class KeyGen { 

    public static void generateKey(String key, String username){ 
    if(Strings.isNullOrEmpty(key)){ 
     Dispatcher.dispatch(new WarningString(String.format("The key is null or empty for user %s", username))); 
    }else{ 
     Dispatcher.dispatch(new InfoString(String.format("The key is correct for user %s", username))); 
    } 
    } 

abstract class VerifyingKeyGen{ 

    public void verifyOtherDetails(String address, Map<String, String> favouriteFilms){ 
    String key =""; 
    String username =""; 
    KeyGen.generateKey(key, username); 
    } 
} 
+0

예를 들어 설명해 주시겠습니까? 나는 당신의 말을 이해하지만 현재까지 내 지식으로 그것을 시도하기 전에 좀 더 많은 독서가 필요합니다. –

+0

애플리케이션/프레임 워크에서 메시지를 수신하는 방법을 모르겠으므로 첫 번째 비트 (발송자 메시지에 가입)를 지원할 수 없습니다. 나는 당신이 생각한다 :). 하지만 래퍼 예제를 제공하겠습니다. 잠시만 기다려주세요. –

+0

Excellent Sam thanks alot –

1

고정 버전을 분리합니다.)

관련 문제