2014-09-23 42 views
0

我有一個單元測試,檢查排序結果列表的順序。確實java lists.transform能改變列表順序嗎?

奇怪的是,測試總是通過在intellij但總是失敗,當我從控制檯./gradlew

運行它可以是不同取決於環境transform或其他方法的工作?

public List<Image> sortImages(List<Image> inputImages, UserInfo userInfo) { 
    if (inputImages == null) { 
     return null; 
    } 
    List<ImageScore> imageScoreList = createImageScoreListFromImageList(inputImages); 
    Collections.sort(imageScoreList, imageScoreDescComparator); 
    imageScoreList = getSubListIfListIsTooLong(userInfo, imageScoreList); 
    List<Image> sortedImages = transformImageScoreListToImageList(imageScoreList); 
    return sortedImages; 
} 

private List<ImageScore> getSubListIfListIsTooLong(UserInfo userInfo, List<ImageScore> imageScoreList) { 
    if (userInfo != null && userInfo.channel != null && userInfo.channel.equals(UserInfo.UserChannel.CLIENT)) { 
     if (imageScoreList.size() > VenueConfig.s.MAX_IMAGES_TO_RETURN_TO_CLIENT) { 
      imageScoreList = imageScoreList.subList(0, VenueConfig.s.MAX_IMAGES_TO_RETURN_TO_CLIENT); 
     } 
    } 
    return imageScoreList; 
} 

private List<Image> transformImageScoreListToImageList(List<ImageScore> imageScoreList) { 
    Collection result = Collections2.transform(imageScoreList, new Function<ImageScore, Image>() { 
     @Override 
     public Image apply(ImageScore input) { 
      return input.image; 
     } 
    }); 

    return new ArrayList(result); 
} 

private List<ImageScore> createImageScoreListFromImageList(List<Image> inputImages) { 
    Collection result = Collections2.transform(inputImages, new Function<Image, ImageScore>() { 
     @Override 
     public ImageScore apply(Image input) { 
      ImageScore imageScore = new ImageScore(input); 
      imageScore.score = imageScoreCalculator.getScoreForImage(input); 
      return imageScore; 
     } 
    }); 
    return new ArrayList(result); 
} 

更新:

我執行以下操作的邏輯:

1)變換ImageImageScore(與元件{int score, Image image}) ,其還設置了得分

2)然後,根據我的排序到得分

3)然後我重新轉換ImageScoreImage

我該如何做到這一點?作爲計算得分上的排序中繼?

+0

在測試斷言中處理這可能是最簡單的。 – vikingsteve 2014-09-23 08:57:56

回答

1

是的,它可能是。

transform返回一個Collection(根據定義,它沒有排序),也沒有提供關於排序的文檔保證。

它似乎總是排序,但這是實現dependendant,沒有你應該依賴。

如果有一個邏輯順序,以你的元素,你可以試試這個:

Collections.sort(result); 
return new ArrayList(result); 

否則,你可以使用某種輔助函數的測試兩個列表的等價無需支付理會排序。

+0

它有問題的我, 我執行以下操作的邏輯: 1)變換'Image'到'ImageScore'(與元件'{INT得分,圖片圖像}') ,其還設置了得分 2)I然後按照分數排序 3)然後,我將ImageScore重新轉換爲Image# 我該如何做到這一點?作爲計算得分上的排序中繼? – 2014-09-23 08:30:29

+0

您可以嘗試在測試斷言中使用實用方法,該方法測試列表是否包含相同的元素,而不考慮是否存在,如'CollectionUtils.isEqualCollection(...)' - 鏈接:http://stackoverflow.com/questions/1565214 /是 - 有一種方式來檢查,如果兩個集合包含相同元素獨立 – vikingsteve 2014-09-23 08:59:43

+0

但我想檢查訂單。將Lists.transform保存順序? – 2014-09-23 09:08:00