【问题标题】:How to mock a method that is expected to return HashMap?如何模拟预期返回 HashMap 的方法?
【发布时间】:2014-10-07 06:36:20
【问题描述】:

我有一个方法应该返回 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 但它仍然返回错误。

【问题讨论】:

  • 你能发个错误吗?
  • 再看看你链接到的问题。比较不在地图之间,而是在循环检查每个条目。
  • 没有。您不应该嘲笑您要测试的课程。模拟就是要消除类的副作用,而不是您正在测试的类。你做错了。
  • @DavidWallace 那么我应该如何测试它?
  • 尝试清楚地表达该方法应该做什么。然后编写适当的输入来测试它是否真的做了它应该做的事情,并计算出预期的输出。然后编写一个测试,使用正确的输入调用该方法,并将输出与您的预期进行比较。但出发点始终是清楚地了解该方法的用途。

标签: java unit-testing junit tdd mockito


【解决方案1】:

如果您尝试进行 TDD,那您就错了。你应该^1:

  1. 添加测试
  2. 运行所有测试,看看新的测试是否失败
  3. 写一些代码
  4. 运行测试
  5. 重构
  6. 重复

简单明了,这就是你想要的。没有模拟或任何东西:

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() 返回“它很热!”或“天气很冷!”,基于对某个位置天气的外部 Web API 的调用。然后,您将模拟天气 API 组件以返回它是 -12 摄氏度,并且您断言您的方法的结果是“天气很冷!”。然后在下一个测试中,您模拟外部 API 组件以返回 +38 摄氏度并断言您的方法返回“天气很热!”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多