Может ли PowerMockito проверять аргументы с помощью 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 и вернуть mocked URL
  • проверить новый экземпляр аргумента URL.class на наличие подстроки (methodName.contains("SearchOrg"), но как?)
  • метод mock openConnection() в зависимости от methodName

Например:

  • если метод PerformPostMethod создает экземпляр нового URL.class с аргументом String, который содержит "SearchOrg", то я хочу заменить его на URL, где метод openConnection() возвращает HttpURLConnection, настроенный для этого аргумента (getInputStream() должен возвращать json со списком организаций).

  • если метод PerformPostMethod создает новый экземпляр URL.class с аргументом String, который содержит "SearchCat", то я хочу заменить его на URL, где метод openConnection() возвращает HttpURLConnection, настроенный для этого аргумента (getInputStream() должен возвращать json со списком категорий).

Осуществимо ли это?


person Alexandr    schedule 04.02.2016    source источник
comment
Привет @Alexandr, не могли бы вы проверить мой ответ? Это помогло вам решить проблему? Дайте мне знать, если у вас есть какие-либо сомнения.   -  person troig    schedule 09.02.2016
comment
@troig да, спасибо. Я очень занят, и я проверю это, как только смогу :)   -  person Alexandr    schedule 09.02.2016


Ответы (1)


Я думаю, вы можете сделать это, комбинируя 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() (мой пример издевается над этим методом). Во всяком случае, я думаю, что на этом примере вы можете увидеть, как это сделать в общих чертах.

Надеюсь, поможет

person troig    schedule 05.02.2016