如何用更好的错误断言对象相等。
假设我们有一个类Truck:
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.
更新了truck对象的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 +
'}';
}
}