[英]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.