真的很短的问题:我怎么能模拟response.getContentType() ?(使用PowerMock + TestNG)
- 我没有调用任何new()方法
- 我正在尝试模拟类,这是其他类的方法执行的结果。
被测类:
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");
}
}
你不会的。你的问题是,你创建了难以测试代码,通过把新的 WebClient调用到你的源代码。这导致了实现的直接耦合。
你应该使用依赖注入来代替(例如注入一个工厂来为你创建WebClient对象)。这样,您就可以使用简易框架(如EasyMock或Mokito)完成所有工作。
提示:通常情况下,使用PowerMock表明您的设计可以改进。不知道我在说什么吗?然后看看这些视频。每一分钟都值得!