测试模拟类中包含的映射



我正在尝试测试一个ExampleController类,它的工作方式有点像我的POJO Example类的门面。

我开始为ExampleController编写InstrumentedTest,因为它适用于Greenrobots EventBus,当我尝试检索存储在ExampleMap中的值时,我得到了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 类。您可以通过在 before-方法中添加以下内容来解决此问题:

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

通过这种方式,您告诉模拟示例在调用getter时返回该hashMap。

我无法立即在javadoc中找到它,但是调试测试表明,每次调用exampleController.getMap((后都会返回映射一个新映射。这就解释了为什么你不能在地图中获取任何内容,然后用你的 exampleController 检索它。

除了这是解决方案之外,您可能想知道是否真的需要模拟示例类。你也可以实例化它,除非你真的想嘲笑它的某些部分。

相关内容

  • 没有找到相关文章

最新更新