簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM