[英]Same value returned by 2 object with same Mocked Interfaces using JMockit
[英]Jmockit - Mocked methods returning interfaces
我有以下設置:
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處理此問題?
提前致謝,
BillDoor
測試應如下:
@Test(expected = IOException.class)
public void loadFile(
@Cascading HttpClientBuilder mockBuilder,
@Mocked final CloseableHttpClient mockClient
) throws Exception
{
new NonStrictExpectations() {{
mockClient.execute((HttpGet) any); result = new IOException("test");
}};
loader.loadFile("uri");
}
HttpClientBuilder#build()
的返回類型為 CloseableHttpClient
,這是一個包含通用方法實現的抽象類。 Apache項目永遠無法將此返回類型更改為其他類型,因為這將是API的重大更改,從而導致編譯錯誤。
同樣,在這種情況下, @Capturing
作用僅與@Mocked
,因為使用@Cascading HttpClientBuilder
意味着不會實例化任何實際的實現類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.