PowerMockito可以用whenNew检查参数吗?

时间:2016-02-04 22:47:04

标签: java mockito powermockito

我有一些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"),但是如何?)
  • 模拟openConnection()方法取决于methodName

例如:

  • 如果方法performPostMethod实例化包含URL.class的{​​{1}}参数的新String,那么我想用"SearchOrg"替换它,其中方法URL返回openConnection()为此参数配置HttpURLConnection必须返回带有组织列表的json。

  • 如果方法performPostMethod实例化包含getInputStream()的{​​{1}}参数的新URL.class,那么我想用String替换它,其中方法"SearchCat"返回URL为此参数配置openConnection()必须返回带有类别列表的json。

可以实现吗?

1 个答案:

答案 0 :(得分: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()(我的例子是嘲笑这个方法)。无论如何,我想通过这个例子你可以看到如何以一般的方式做到这一点。

希望有所帮助