[英]how to assert objects are equal in a test with a better error?
如何斷言對象相等但有更好的錯誤。
可以說我們有一類卡車:
import java.util.List;
public class Truck {
private String model;
private String make;
private int year;
public Truck(String model, String make, int year) {
super();
this.model = model;
this.make = make;
this.year = year;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
測試:
@Test
public void truckTest () {
Truck pickupTruck1 = new Truck("Big 10", "Chevy", 1976);
Truck pickupTruck2 = new Truck("Big 10", "Chevy", 1975);
//assertThat(pickupTruck1, equalTo(pickupTruck2));
//this error is not help full java.lang.AssertionError:
//Expected: <com.tests.tests.library.Truck@59c0fef4>
//but: was <com.tests.tests.library.Truck@da27335>
assertThat(pickupTruck1, samePropertyValuesAs(pickupTruck2));
}
波紋管錯誤非常有用:
java.lang.AssertionError:
Expected: same property values as Truck [make: "Chevy", model: "Big 10", parts: null, year: <1975>]
but: year was <1976>
現在說我們將Truck對象更新得有點復雜:
package com.tests.tests.library;
import java.util.List;
public class Truck {
private String model;
private String make;
private int year;
private List<TruckPartsObject> parts;
public Truck(String model, String make, int year) {
super();
this.model = model;
this.make = make;
this.year = year;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public List<TruckPartsObject> getParts() {
return parts;
}
public void setParts(List<TruckPartsObject> parts) {
this.parts = parts;
}
}
添加TruckPartsObject:
import java.util.HashMap;
public class TruckPartsObject {
private String name;
private String price;
private HashMap<String, String> partsHashMap;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public HashMap<String, String> getPartsHashMap() {
return partsHashMap;
}
public void setPartsHashMap(HashMap<String, String> partsHashMap) {
this.partsHashMap = partsHashMap;
}
}
更新測試:
@Test
public void truckTest () {
Truck pickupTruck1 = new Truck("Big 10", "Chevy", 1976);
Truck pickupTruck2 = new Truck("Big 10", "Chevy", 1975);
List<TruckPartsObject> parts = new ArrayList<TruckPartsObject>();
TruckPartsObject truckPartsObject = new TruckPartsObject();
truckPartsObject.setName("part1");
parts.add(truckPartsObject);
pickupTruck1.setParts(parts);
assertThat(pickupTruck1, samePropertyValuesAs(pickupTruck2));
}
輸出:
java.lang.AssertionError:
Expected: same property values as Truck [make: "Chevy", model: "Big 10", parts: null, year: <1975>]
but: parts was <[com.tests.tests.library.TruckPartsObject@11c03d7b]>
我該如何修復最后的輸出來像原始輸出一樣有幫助。 它在哪里告訴我為什么對象不相等。 希望使測試運行輸出可讀並易於調試。
I tried implementing equals method in the truck object but when the assert fails then then the message is still not helpful.
更新了卡車對象以具有equals方法:
@Override
public boolean equals(Object obj) {
Truck MyTruck = (Truck) obj;
if(this.year == MyTruck.year)
{
return true;
}
else
{
return false;
}
}
更新測試:
assertThat(pickupTruck1, equalTo(pickupTruck2));
輸出:
java.lang.AssertionError:
Expected: <com.tests.tests.library.Truck@38862c65>
but: was <com.tests.tests.library.Truck@70ccb7e0>
為了在任何情況下都能獲得良好的輸出,您應該始終重寫toString()
public Truck(String model, String make, int year) {
super();
this.model = model;
this.make = make;
this.year = year;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public List<TruckPartsObject> getParts() {
return parts;
}
public void setParts(List<TruckPartsObject> parts) {
this.parts = parts;
}
@Override
public String toString() {
return "Truck{" +
"model='" + model + '\'' +
", make='" + make + '\'' +
", year=" + year +
", parts=" + parts +
'}';
}
}
public class TruckPartsObject {
private String name;
private String price;
private HashMap<String, String> partsHashMap;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public HashMap<String, String> getPartsHashMap() {
return partsHashMap;
}
public void setPartsHashMap(HashMap<String, String> partsHashMap) {
this.partsHashMap = partsHashMap;
}
@Override
public String toString() {
return "TruckPartsObject{" +
"name='" + name + '\'' +
", price='" + price + '\'' +
", partsHashMap=" + partsHashMap +
'}';
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.