【发布时间】:2015-05-18 16:43:29
【问题描述】:
如何用更好的错误断言对象相等。
假设我们有一个卡车类:
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>
【问题讨论】:
-
简答:你需要覆盖
Truck.toString()。
标签: java testing automation hamcrest rest-assured