【问题标题】:how to assert objects are equal in a test with a better error?如何在具有更好错误的测试中断言对象相等?
【发布时间】: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


【解决方案1】:

为了在任何情况下都能获得良好的输出,您应该始终覆盖 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 +
                '}';
    }
}

【讨论】:

  • 波纹管错误很有用:java.lang.AssertionError:预期:与卡车相同的属性值 [make: "Chevy", model: "Big 10", parts: null, year: ]但是:当我覆盖 toString() 时,年份是 ,然后消息很长,它会打印整个 toString()。我想打印出问题就像上面一样。通过查看这个,我可以看到年份不匹配。
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多