測者的測試技術手冊:測試應該關注java.util.List.subList的坑

java中有一個返回子列表的方法:


 
  1. public list<E> subList(int fromIndex, int toIndex){

  2.       subListRangeCheck(fromIndex, toIndex,size);

  3.       return new SubList(this , 0, fromIndex, toIndex);

  4. }

返回一個fromIndex爲起點,toIndex爲終點(不包含終點)的子列表。從上實現代碼中可以看到,先檢查一下單籤的fromIndex和toIndex是否合法,如果不合法,那麼就退出了該函數邏輯。要是合法,可以看出其返回了一個this也就是原始列表的部分元素視圖,這樣就形成了一個子列表。

這也導致了,如果針對原來的list或者是sublist返回的list的修改(這裏的修改是不涉及list大小),都是對同一段內存存儲的數據做修改。(這種修改叫做非結構修改)

如果發生結構性修改的是原來的list(不包括由於返回的子list導致的改變),那麼返回的子list語義上將會是undefined。在AbstractList(ArrayList的父類)中,undefined的具體表現形式是拋出一個ConcurrentModificationException。如果你在調用了sublist返回了子list之後,如果修改了原list的大小,那麼之前產生的子list將會失效,變得不可使用。

特別提醒:在使用sublist部分的白盒測試要重點對上述情況做測試。

關注測者,關注測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章