如何模拟预期返回HashMap的方法?

时间:2014-10-07 06:36:21

标签: java unit-testing junit tdd mockito

我有一个方法需要返回HashMap类型的结果,我需要对它进行单元测试。 该方法应该接收一个字符串并显示每三个字符的出现。

public HashMap<String,Integer> findOccurences(String myStr){
    return null;
}

我需要知道如何使用Mockito为它编写单元测试。

public class TestMySubString {
    @Mock
    private static MySubString mockedMySub;
    private static String str;
    private static HashMap<String,Integer> result;

    @BeforeClass
    public static void setUp(){
        str = "This This"; 
        result.put(" Th", 1);
        result.put("s T",1); 
        result.put("his",2);
        result.put("Thi ",2);
        result.put("is ",1);
        when(mockedMySub.findOccurences(str)).thenReturn(result);
    }

    @Test
    public void testFindOccurences() {
        HashMap<String,Integer> myResult = mockedMySub.findOccurences(str);
        //assertReflectionEquals(result,myResult);
    }

基于此question我使用了assertReflectionEquals但它仍然返回错误。

1 个答案:

答案 0 :(得分:3)

如果你正在尝试做TDD,那你就错了。你应该^1

  1. 添加测试
  2. 运行所有测试,查看新测试是否失败
  3. 写一些代码
  4. 运行测试
  5. 重构
  6. 重复
  7. 简单明了,这就是你想要的。没有嘲笑或任何东西:

    public class MySubStringTest {
    private MySubString mySubString = new MySubString();
    
    @Test
    public void testFindOccurences() {
        final Map<String,Integer> myResult = mySubString.findOccurences("This This");
        final Map<String, Integer> expected = new HashMap<String, Integer>() {
            {
                put("Thi", 2);
                put("his", 2);
                put("is ", 1);
                // etc
            }
        };
        assertEquals(expected, myResult);
    }
    }
    

    在您完成此操作后,您已完成上述列表中的第1步。运行它并看到它失败(步骤2),然后为您的方法编写实现(步骤3)等。

    当您测试的方法具有外部依赖性时,您应该使用模拟。例如,您有一个方法public String getWeather(),它返回“它很热!”或者“很冷!”,基于对某个地方天气的外部网络API的调用。然后你嘲笑天气API组件返回它是-12摄氏度,你断言你的方法的结果是“它很冷!”。然后在下一个测试中,您模拟外部API组件以返回它是+38摄氏度并断言您的方法返回“它很热!”。