PowerMock模拟外部库



真的很短的问题:我怎么能模拟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表明您的设计可以改进。不知道我在说什么吗?然后看看这些视频。每一分钟都值得!

相关内容

  • 没有找到相关文章

最新更新