2017-03-02 105 views
1

我試圖測試我的Utils類。其中一些方法使用其他類方法。我想嘲笑內部方法的使用,所以測試會假設它們工作(爲了使它成爲真正的單元測試,它測試了具體的方法)。Mockito - 方法裏面的測試方法

我想測試 'buildUrl' 的方法:

public static String buildUrl(String path, List<Pair> queryParams, DateFormat dateFormat) { 
    final StringBuilder url = new StringBuilder(); 
    url.append(path); 

    if (queryParams != null && !queryParams.isEmpty()) { 
     // support (constant) query string in `path`, e.g. "/posts?draft=1" 
     String prefix = path.contains("?") ? "&" : "?"; 
     for (Pair param : queryParams) { 
      if (param.getValue() != null) { 
       if (prefix != null) { 
        url.append(prefix); 
        prefix = null; 
       } else { 
        url.append("&"); 
       } 
       String value = Utils.parameterToString(param.getValue(), dateFormat); 
       url.append(Utils.escapeString(param.getName())).append("=").append(Utils.escapeString(value)); 
      } 
     } 
    } 

    return url.toString(); 
} 

BuildUrl使用,我想嘲笑爲測試 'parameterToString'(及其他)。所以我嘗試了這樣的事情:

@Test 
public void testBuildUrl(){ 
    Utils util = new Utils(); 
    Utils utilSpy = Mockito.spy(util); 
    Mockito.when(utilSpy.parameterToString("value1",new RFC3339DateFormat())).thenReturn("value1"); 
    List<Pair> queryParams = new ArrayList<Pair>(); 
    queryParams.add(new Pair("key1","value1")); 
    String myUrl = utilSpy.buildUrl("this/is/my/path", queryParams, new RFC3339DateFormat()); 
    assertEquals("this/is/my/path?key1=value1&key2=value2", myUrl); 
} 

但我從Mockito得到MissingMethodInvocationException。 所以我的問題實際上是 - 如何模擬在被測方法中被調用的方法,以及我的測試有什麼問題。謝謝。

回答

0

您不能使用標準Mockito模擬/偵察靜態調用。

你將不得不使用Powermockito有所爲以下幾點:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Utils.class)  
public class MyClassTest{ 

    @Test 
    public void testBuildUrl(){ 
     PowerMockito.mockStatic(Utils.class); 

     // mock the static method to return certain values 
     Mockito.when(Utils.parameterToString("value1",new RFC3339DateFormat())) 
      .thenReturn("value1"); 
     Mockito.when(Utils.escapeString(anyString()).thenReturn(desiredResult); 

     // rest of test code 
    } 

下面是一些更多的東西通讀 - >powermockito static

0

我想嘲笑內部方法使用這樣的測試會假設他們工作(爲了使其成爲真正的單元測試,哪個測試具體方法)。

單元測試做測試具體方法秒。

單元測試測試公衆觀察到的行爲被測代碼


如果你覺得你應該嘲笑一些方法,這可能表明你的設計需要改進。沒有必要制定實用方法static,也許你的課堂要承擔很多責任。

因爲PowerMock將克服你的測試中的問題,但恕我直言,使用PowerMock是一個不良設計的投降。