如何使用PowerMock测试方法Jsoup.connect(静态)?

时间:2013-10-29 12:45:54

标签: java testing mocking mockito powermock

这是我的代码:

public void analyze(String url) throws SiteBusinessException {
        Document doc = null;
        Response response = null;
        try {
            response = Jsoup.connect(url).execute();
            doc = Jsoup.connect(url).get();
        } catch (IOException e) {
            LOGGER.warn("Cannot analyze site [url={}, statusCode={}, statusMessage={} ]", new Object[] {url, response.statusCode(), response.statusMessage()});
            throw new SiteBusinessException(response.statusMessage(), String.valueOf(response.statusCode()));
        }
    }

如何使用PowerMock测试此方法?我想编写测试来检查当调用.execute()然后抛出IOException然后它捕获然后抛出SiteBusinessException。

我的测试代码。

@RunWith(PowerMockRunner.class)
@PrepareForTest({Jsoup.class})

Test(expected = SiteBusinessException.class)
    public void shouldThrowIOException() throws Exception {
        Connection connection = PowerMockito.mock(Connection.class);

    Response response = PowerMockito.mock(Response.class);

    PowerMockito.when(connection.execute()).thenReturn(response);

    PowerMockito.mockStatic(Jsoup.class);

    expect(Jsoup.connect(SITE_URL)).andReturn(connection);

    replay(Jsoup.class);

    PowerMockito.when(Jsoup.connect(SITE_URL).execute()).thenThrow(new IOException());

    AnalyzerService sut = new AnalyzerServiceImpl();
    sut.analyzeSite(SITE_URL);

    }

我得到了

java.lang.Exception: Unexpected exception, expected<com.siteraport.exception.SiteBusinessException> but was<java.lang.IllegalStateException>

...

1 个答案:

答案 0 :(得分:2)

您需要创建Jsoup类的静态模拟。在测试用例中创建了这样的模拟后,您可以使用它编写您的期望。

请参阅mock static method using PowerMockito文档。

这里使用Mockito和PowerMockito的测试用例:

我能够使用Mockito + Powermockito模拟执行方法(你同时使用EasyMock和Mockito?)测试用例中的代码如下所示:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Jsoup.class})
public class MyClassTest {

    @Test(expected = SiteBusinessException.class)
    public void shouldThrowIOException() throws Exception {
        String SITE_URL = "some_url_string";

        Connection connection = Mockito.mock(Connection.class);
        Mockito.when(connection.execute()).thenThrow(new IOException("test"));
        PowerMockito.mockStatic(Jsoup.class);

        PowerMockito.when(Jsoup.connect(Mockito.anyString())).
            thenReturn(connection);

        AnalyzerService sut = new AnalyzerService();
        sut.analyze(SITE_URL);
    }
}