簡體   English   中英

如何使用JUnit測試對象數組

[英]How to test an array of objects with JUnit

嘗試檢查將模塊對象添加到數組的方法可以正常工作。 我如何編寫一個JUnit測試來測試是否確實將對象添加到數組中?

這是我到目前為止的內容:

@Test
public void testAddModule() {
    Student chris = new Student("Chris", "1");
    Module csc8001 = new Module("CSC8001", "Programming and data structures", 5, 5, 0, 7);
    Module csc8002 = new Module("CSC8002", "Programming II", 5, 5, 0, 7);   
    chris.addModule(csc8001);
    chris.addModule(csc8002);


    Module [] expectedResult = {csc8001,csc8002};
    ModuleRecord[] resultArray = Student.moduleRecords;

    Assert.assertArrayEquals( expectedResult, resultArray );

}

我的問題是數組僅存儲對對象的引用,如何測試以查看數組是否存儲了正確的信息?

assertArrayEquals正確的軌道上: assertArrayEquals應該可以工作。 您要尋找的概念是淺等於(“ == ”)和深等於(“ .equals ”)之間的差異,這與引用相等(“ == ”)和對象相等(“ .equals之間的差異有關.equals “)

如果兩個數組的長度相同,並且包含完全相同的原始值和引用,則很容易說它們相等:即使數組本身是不同的對象, [0, 1] [0, 1]等於[0, 1] ,並且[csc8001, csc8002][csc8001, csc8002] [csc8001, csc8002]發生相同的情況。 這稱為“淺”相等,並且計算非常快。

如果您實際上想使用對象的equals方法比較對象,則需要“深度”相等。 這將檢查條目的正確數量,並檢查所有n x[n].equals(y[n]) 這可能會花費更長的時間,因為Java不能僅僅比較引用;而是需要對引用進行比較。 它實際上在對象上調用了一個方法。 不過,這僅在您覆蓋equals時才有意義。 如果您的模塊未覆蓋equals則使用Object的內置equals方法,其行為與==相同。

無論如何,在文檔中都不太清楚,但是Assert.assertArrayEquals調用Assert.internalArrayEquals ,它基本上使用.equals深層比較

剩下三個選項:

  • 繼續使用assertArrayEquals 那就是它的目的,並且因為相等的引用意味着相等的對象,所以這是正確的做法。
  • 繼續使用assertArrayEquals但還要編寫Module.equals方法以證明數據本身是相同的。 請記住,這僅是一個問題,如果您想證明兩個不同的實例在其數據基礎上表現出相同的效果,並且您現在不必擔心這一點。
  • 就像Jason提到的那樣,分出要測試的內容,它無需編寫equals方法即可確認數據正確:

     assertEquals(2, resultArray.length); Module addedModule = resultArray[1]; assertEquals("CSC8002", addedModule.code); /* ... */ 

如果您確實嘗試覆蓋equals ,請小心:您需要堅持一些規則,還需要覆蓋hashCode 在這里閱讀更多。

蠻力方法是檢查數組是否具有預期的條目數,然后存儲在數組中的每個對象均具有預期的屬性值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM