2014-10-31 63 views
1

嗨我想測試的分配器調度的generateKey方法和消息。我試圖嘲笑類和公共方法verifyOtherDetails()。在它裏面我創建了一個期望,調度器方法有一個字面值,但它總是通過。任何幫助,將不勝感激。測試一個私有的靜態方法

請參閱我的嘗試代碼的底部謝謝。

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

在測試私有方法方面已經有很多材料 - 包括[其他答案在SO](http://stackoverflow.com/questions/34571),包括如果你谷歌的頂部命中[文本這個問題的主題行](https:// www .google.com/webhp?離子= 1#Q =測試%20A%20private%20Static%20method)。那些回答你的問題嗎? – yshavit 2014-10-31 15:52:57

+0

我已經看到了使用反射,但我想看看是否有更清晰的方法來驗證方法。我是JMockit的新手,對嘲笑對象沒有太多經驗。 – 2014-10-31 16:00:29

回答

2

鑑於你的設計,我會說它很難測試你的方法。基本上這是因爲你使用調度類的靜態方法,所以你不能輕易地嘲笑它。

雖然你有一個選擇的轎跑車。您可以訂閱測試中的調度程序消息並檢查預期的消息是否到達。這是最不具有侵入性的,並且可用作綜合測試。

另一種選擇是將調度程序靜態調用包裝到接口中,並將此接口的模擬插入到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); 
    } 
} 

第三個選項是私有方法移動到不同的靜態類,並把它公開,那麼你可以測試類(與你的靜態調度員同樣的問題)。然後你的KeyGen類可以成爲一個VerifyingKeyGen它只是驗證然後委託給其他方法來實際生成密鑰。這很好地分離的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

你能否指點我一個例子的方向。我明白你的意思,但憑藉我的知識,在能夠嘗試之前需要多讀一些。 – 2014-10-31 16:07:05

+0

我不能幫助第一個位(訂閱調度程序消息),因爲我不知道如何訂閱接收消息在您的應用程序/框架。我認爲你儘管:)。但我會提供一個包裝的例子,給我一點。 – 2014-10-31 16:09:14

+0

優秀的山姆非常感謝 – 2014-10-31 16:28:53

1

修正版本:

@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); }}; 
} 

(提供WarningString實現equals方法。 )