2016-02-04 69 views
2

我有一些API的實現。PowerMockito可以檢查whenNew的參數嗎?

例如:

public class SoPostApi implements SoApi { 

... 

@Override 
public void searchOrganizations(String query, ...) { 
    String jsonResponse = performPostMethod("SearchOrg", ...); 
    ... 
} 

@Override 
public void searchCategories(String query, ...) { 
    String jsonResponse = performPostMethod("SearchCat", ...); 
    ... 
} 

private String performPostMethod(String methodName, ...) { 
    URL url = new URL(API_URL + methodName); 
    ... 
} 

而且我想用PowerMockito進行測試。

我怎麼看它:的URL.class

  • 捕捉新的實例,並返回URL.class說法mocked URL
  • 檢查新實例包含子取決於
  • 模擬openConnection()方法(methodName.contains("SearchOrg"),但怎麼樣?) methodName

例如:

  • 如果方法performPostMethod實例化一個新的URL.classString參數包含"SearchOrg"那麼我想URL取代它在其中方法openConnection()返回HttpURLConnection可配置該參數(getInputStream()必須與組織的名單返回JSON)。

  • 如果方法performPostMethod實例化一個新的URL.classString參數包含"SearchCat"那麼我想URL取代它在其中方法openConnection()返回HttpURLConnection可配置該參數(getInputStream()必須類別列表返回JSON)。

是否可以實現?

+0

嗨@Alexandr,你能檢查我的答案嗎?它有助於你解決問題嗎?如果您有任何疑問,請告訴我。 – troig

+0

@謝謝你,謝謝。我很忙,我儘快檢查它:) – Alexandr

+0

完全不用擔心 – troig

回答

2

我認爲你可以做到這一點結合whenNew(...)thenAnswer() Mockito功能。

有點像舉例如下:

final InputStream inputStreamOrg = null; // Load your Org json input stream 
    final URL urlSearchOrg = PowerMockito.mock(URL.class); 
    Mockito.when(urlSearchOrg.openStream()).thenReturn(inputStreamOrg); 

    final InputStream inputStreamCat = null; // Load your Cat json input stream 
    final URL urlSearchCat = PowerMockito.mock(URL.class); 
    Mockito.when(urlSearchCat.openStream()).thenReturn(inputStreamCat); 


    PowerMockito.whenNew(URL.class).withArguments(Mockito.any(String.class)) 
     .thenAnswer(new Answer<Object>() { 
      @Override 
      public URL answer(InvocationOnMock invocation) throws Throwable { 
       String spec = (String) invocation.getArguments()[0]; 
       if (spec.contains("SearchOrg")) { 
       return urlSearchOrg; 
       } else if (spec.contains("SearchCat")) { 
        return urlSearchCat; 
       } else { 
       // OTher casees 
       return null; 
       } 
      } 
     }); 

:只要注意,您在OP要嘲笑openConnection()方法返回一個InputStream。我認爲這是一個混亂,因爲openConnection不會返回InputStream。我認爲你指的是方法openStream()(我的例子是嘲笑這種方法)。無論如何,我認爲通過這個例子你可以看到如何以一般的方式做到這一點。

希望它有幫助