簡體   English   中英

PowerMockito 可以使用 whenNew 檢查參數嗎?

[英]Can PowerMockito check arguments with whenNew?

我有一些 API 的實現。

例如:

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
  • 檢查URL.class參數的新實例以包含子字符串( methodName.contains("SearchOrg") ,但是如何?)
  • 模擬openConnection()方法取決於methodName

例如:

  • 如果方法 performPostMethod 使用包含"SearchOrg" String參數實例化一個新的URL.class ,那么我想用URL替換它,其中方法openConnection()返回為此參數配置的HttpURLConnectiongetInputStream()必須返回帶有組織列表的 json)。

  • 如果方法 performPostMethod 使用包含"SearchCat" String參數實例化一個新的URL.class ,那么我想用URL替換它,其中方法openConnection()返回為此參數配置的HttpURLConnectiongetInputStream()必須返回帶有類別列表的 json)。

可以實現嗎?

我認為你可以結合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() (我的例子是嘲笑這個方法)。 無論如何,我認為通過這個例子你可以看到如何以一般的方式做到這一點。

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM