簡體   English   中英

新不返回模擬實例時執行PowerMock

[英]PowerMock whenNew Not Returning Mocked Instance

我正在嘗試使用PowerMock緩沖對Jackson ObjectMapper的調用,但由於某種原因它無法正常工作,我懷疑它與whenNew在所測試的方法中實例化時未實際提供模擬實例有關。

這是我們無法真正更改的遺留代碼庫,因此我們無法使用PowerMock來滿足測試覆蓋率要求...

我有一種方法,類似於以下內容:

private void intakeDataFromUrl(URL url) {
    ObjectMapper mapper = new ObjectMapper();
    DataDTO[] dataDtos = mapper.readValue(url, DataDTO[].class)

    // other code
}

在單元測試中,我嘗試執行以下操作:

@Test
public void test_intakeDataFromUrl() {

    DataDTO[] data = this.createMockData();

    ObjectMapper mapper = mock(ObjectMapper.clas);

    whenNew(ObjectMapper.clas)
        .withNoArguments()
        .thenReturn(mapper);

    // mock call to return mocked data
    doReturn(data)
        .when(mapper, "readValue", any(URL.class), any(DataDTO[].class))
}

但是在被測試的代碼中,dataDtos始終為null,然后代碼的下一部分始終失敗。

編輯:

看起來這條線可能是問題所在,盡管查看其他示例也可以。

// mock call to return mocked data
doReturn(data)
    .when(mapper, "readValue", any(URL.class), any(DataDTO[].class))

我也嘗試過最后一個參數上的isA和eq,但是沒有運氣,仍然返回null。

ObjectMapper使用whenNew的以下用法可以成功工作:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ObjectMapper.class})
public class WtfTest {

    @Test
    public void test_intakeDataFromUrl() throws Exception {
        String in = "in";
        String out = "out";

        ObjectMapper mapper = mock(ObjectMapper.class);

        PowerMockito.whenNew(ObjectMapper.class)
                .withNoArguments()
                .thenReturn(mapper);

        Mockito.when(mapper.readValue(in, String.class)).thenReturn(out);

        assertEquals(out, intakeDataFromUrl(in));
    }

    private String intakeDataFromUrl(String url) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(url, String.class);
    }
}

盡管此示例未使用DataDTO ,但與您的示例一致,並且可以正常使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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