iT邦幫忙

0

[Java] Junit 如何assert new出來的物件,即使他們的值相同?

  • 分享至 

  • xImage

想問一下,如下的class要怎麼驗證呢?

class Player {
    private String name;
    private List<Cards> cards;
    public Player(String name) {
        this.name = name;
    }
}

//------------------------------------------

@Test
void parser_player_name() {

   List<Player> players = parser.Parse("...略");
   
   Assertions.assertEquals(players, new ArrayList<Player>() {{
            add(new Player("Black"));
            add(new Player("White"));
   }});

自己實際用Junit assertEquals,會因為是動態new出右邊比較的物件
,導致跟players被判定是不同的List(因不同記憶體位置,而被判定失敗)。

我是可以用for..in的方式,將物件裡面每一個值取出,但這樣我想驗證cards又變成有一點麻煩

我查了許多資料,用了許多不同的方式,還是失敗。
所以想來問問看,找尋一下新的方向

感謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
shootingstar
iT邦新手 4 級 ‧ 2023-02-17 07:51:35

你的Player要實作equals(),此外List的相等性會包含裡頭元素的順序,所以若要比較兩個List也要考慮其順序

joey3060 iT邦新手 5 級 ‧ 2023-02-17 09:37:28 檢舉

感謝你,我會試試看!

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-17 08:50:41

你可以使用 JUnit 的 assertIterableEquals() 方法。

範例程式碼:

@Test
void parser_player_name() {

    List<Player> players = parser.Parse("...略");
    List<Player> expectedPlayers = new ArrayList<>();
    expectedPlayers.add(new Player("Black"));
    expectedPlayers.add(new Player("White"));
    Assertions.assertIterableEquals(expectedPlayers, players);
}

joey3060 iT邦新手 5 級 ‧ 2023-02-17 09:37:21 檢舉

感謝你,我會試試看!

joey3060 iT邦新手 5 級 ‧ 2023-02-18 22:13:53 檢舉

我用aseertIterableEquals如果遇到這個情況還是不會過喔,Player的地址還是不太樣。
我後面是用assertj+usingRecursiveFieldByFieldElementComparator
.containsAll()才過的

我要發表回答

立即登入回答