如何按领域反思性地比较POJO

2022-09-04 02:59:34

我基本上正在寻找一个单元测试框架,我可以用来比较不覆盖等于和有代码方法的POJO。我看了一下JUnit,Test NG和Mockito,但它们似乎并没有解决目的。

例如,考虑下面的代码:

public class CarBean { 

    private String brand;
    private String color;

    public CarBean (){
    }

    public CarBean (String brand, String color){
        this.brand= brand;
        this.color= color;
    }

    /**
     * @return the brand
     */
    public String getBrand() {
        return brand;
    }

    /**
     * @param the brand to set
     */
    public void setBrand(String brand) {
        this.brand= brand;
    }

    /**
     * @return the color
     */
    public String getColor() {
        return color;
    }

    /**
     * @param the color to set
     */
    public void setColor(String color) {
        this.color= color;
    }
}

POJO CarBean代表了一辆现实世界的汽车。它有两个参数,品牌和颜色。现在,假设您有两个汽车对象,如下所示:

CarBean car1 = new CarBean("Ford","Black");
CarBean car2 = new CarBean("Ford","Black");

这两个对象具有相同的参数值。但是当你使用等值来比较这个时,它返回 false :

car1.equals(car2); // This returns false

现在我需要对返回 CarBean 对象的方法进行单元测试。在这种情况下,我要么需要逐个比较carbean属性,要么需要实现equals()和hashcode()方法。

所以我的问题是 - 是否已经有一个单元测试框架可以处理这个问题?


答案 1

重写 pojo 类中的 toString() 方法,如下所示

@Override
public String toString() {
    return "brand: " + this.brand + ",color: " + this.color;
}


car1.toString().equals(car2.toString()); //It will return true if both objects has same values

如果你有大的参数,我会建议你去波纹管代码

public static boolean comparePOJO(Object obj1, Object obj2) {
    return new Gson().toJson(obj1).equals(new Gson().toJson(obj2));
}
comparePOJO(car1,car2); //It will return true

答案 2

这种类型的反射作为SamePropertyValuesAs内置于Hamcrest中,它比较了以bean命名的属性(getFoo,isBar),而不是可能为它们提供支持的字段。核心Hamcrest支持内置于JUnit中,因此您只需要添加包含SamePropertyValuesAs匹配器的Hamcrest库即可。

assertThat(car1, samePropertyValuesAs(car2));

推荐