我有一些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。
可以实现吗?
答案 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()
(我的例子是嘲笑这个方法)。无论如何,我想通过这个例子你可以看到如何以一般的方式做到这一点。
希望有所帮助