非常简短的问题:如何模拟 response.getContentType()? (使用PowerMock + TestNG)
受测试的课程:
class ClassToBeMocked {
public String getJsonPage(String jsonUrl) throws IOException {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
final Page page = webClient.getPage(jsonUrl);
final WebResponse response = page.getWebResponse();
final String cType = response.getContentType();
if (cType.equals("application/json") || cType.equals("application/hal+json")) {
return response.getContentAsString();
}
throw new IllegalArgumentException("Unexpected response type " + response.getContentType());
}
}
测试自己
@PrepareForTest( { WebResponse.class, ClassToBeMocked.class})
@PowerMockIgnore("javax.net.ssl.*")
public class UrlPullerTest extends PowerMockTestCase {
@Test
public void testGetPage() throws Exception {
WebResponse mockwebResposne = PowerMockito.mock(WebResponse.class);
PowerMockito.when(mockwebResposne.getContentType()).thenReturn("wrongType");
ClassToBeMocked classToBeMocked = new ClassToBeMocked();
classToBeMocked.getJsonPage("http://google.com");
}
}
答案 0 :(得分:1)
你不会。您的问题是您通过将新 WebClient调用放入源代码中来创建难以测试代码。这导致了实现的直接耦合。
您应该使用依赖注入(例如注入一个工厂,为您创建WebClient对象)。这样,您可以使用EasyMock或Mokito等无电源框架完成所有工作。
提示:经常使用PowerMock表明您的设计可以改进。不知道我在说什么?然后观看这些videos。每一分都值得每一分钟!