PowerMock模拟外部库

时间:2016-09-09 22:12:20

标签: java mocking mockito testng 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");
    }
}

1 个答案:

答案 0 :(得分:1)

你不会。您的问题是您通过将 WebClient调用放入源代码中来创建难以测试代码。这导致了实现的直接耦合。

您应该使用依赖注入(例如注入一个工厂,为您创建WebClient对象)。这样,您可以使用EasyMock或Mokito等无电源框架完成所有工作。

提示:经常使用PowerMock表明您的设计可以改进。不知道我在说什么?然后观看这些videos。每一分都值得每一分钟!