簡體   English   中英

測試模擬類中包含的地圖

[英]Testing a map contained in a mocked class

我正在嘗試測試ExampleController類,該類的工作方式類似於POJO Example類的外觀。

我開始為ExampleController編寫InstrumentedTest ,因為它可以與Greenrobots EventBus一起使用,並且在嘗試檢索Example類中存儲在Map中的值時遇到了NullPointerException
我使用Mockito v2.7.19Espresso 2.2.2JUnit 4.12

我使用以下示例設置在單元測試中重新創建了我的問題:

class Example {
    private HashMap<Integer, String> map;
    Example(){ map = new HashMap<>(); }
    //getter and setter for map
}

class ExampleController {
    private Example example;
    ExampleController(Example example){ this.example = example; }

    public HashMap<Integer, String> getMap(){ return example.getMap(); }
}

測試類別:

class ExampleControllerTest {
    ExampleController exampleController;

    @Before
    public void setUp() throws Exception {
        Example example = mock(Example.class);
        exampleController = new ExampleController(example);
    }

    @Test
    public void testPutThingsInMap() throws Exception {
        HashMap<Integer, String> map = exampleController.getMap();
        map.put(1, "Test");
        exampleController.getMap().putAll(map);

        assertEquals(1, exampleController.getMap().size());
    }
}

當我運行測試類時,得到以下輸出:

java.lang.AssertionError: 
Expected :1
Actual   :0

由於我是測試的新手,所以我不知道哪里出錯了。 當我搜索單元測試列表時,我只會找到對象中未包含的列表的測試。

您不能使用那樣的“ getMap”方法,因為您在ExampleController中模擬了Example類。 您可以通過在方法前添加以下內容來解決此問題:

HashMap<Integer, String> mapInMock = new HashMap<>();
when(example.getMap()).thenReturn(mapInMock);

這樣,您就告訴模擬的示例在調用getter時返回該hashMap。

我無法立即在javadoc中找到它,但是調試測試顯示該地圖在每次調用exampleController.getMap()之后都會返回一個新地圖。 這就解釋了為什么您無法在地圖中獲得任何內容並隨后使用exampleController對其進行檢索。

除了這是解決方案之外,您還可以懷疑是否確實需要模擬Example類。 您也可以只實例化它,除非您實際上想模擬它的某些部分。

暫無
暫無

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

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