【发布时间】:2014-09-16 09:33:37
【问题描述】:
我有以下设置:
public String loadFile(String uri) throws ClientProtocolException, IOException {
StringBuilder resp = new StringBuilder();
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);
}
Testclass 如下所示:
@RunWith(JMockit.class)
public class FakeLoaderTest {
FakeLoader loader = new FakeLoader(); //class under test
@Test
public void testLoadFile(
@Mocked @Cascading final HttpClientBuilder mockBuilder,
@Capturing final HttpClient mockClient
) throws IOException, URISyntaxException{
new Expectations() {{
HttpClientBuilder.create().build(); result = mockClient;
mockClient.execute(withAny(mockget)); result = new IOException("test - test");
}};
loader.loadFile();
}
}
这给了我“意外调用 ClosableHttpClient.execute - 预期是 HttpClient.execute”
HttpClientBuilder.create.build() 返回一个 ClosableHttpClient,它实现了 HttpClient。我认为@Capturing 负责模拟所有扩展相关类/接口的类?
这工作正常,正如预期的那样:
@Mocked @Cascading final HttpClientBuilder mockBuilder,
@Capturing final **Closeable**HttpClient mockClient
但我想针对接口进行测试,因为我没有测试使用的 HttpClient 实现。 在这个测试中,我不在乎 apache 的某个人是否决定 ClosableHttpClient 被“ThinHttpCLient”成功作为默认实现,只要 apache 坚持使用 HttpClient 接口,我就不想改变这个测试用例。它是关于测试 IO 异常的内部处理(例如,他是否登录到正确的位置?他是否正确重试等)
如何使用 JMockit 和 JUnit 处理这个问题?
提前致谢,
比尔门
【问题讨论】: