我有一个方法,它应该返回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);
}
基于这个问题,我使用了assertReflectionEquals,但它仍然返回一个错误。
如果您正在尝试TDD,那么您就错了。您应该^1:
- 添加测试
- 运行所有测试,看看新测试是否失败
- 写一些代码
- 运行测试
- 重构
- 重复
简单明了,这就是你想要的。没有模拟或任何东西:
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);
}
}
在你把这些做好之后,你就完成了上面列表的第一步。运行它并看到它失败(步骤2),然后为您的方法编写一个实现(步骤3),等等
当被测试的方法具有外部依赖关系时,应该使用mocking。例如,您有一个方法public String getWeather()
,该方法基于对某个位置的天气的外部web API的调用,返回"It is hot!"或"It is cold!"。然后,你会嘲笑天气API组件,返回它是-12摄氏度,并断言你的方法的结果是"它很冷!"。然后在下一个测试中,模拟外部API组件,返回温度为+38摄氏度,并断言您的方法返回"it’s hot!"。