如何使用assertEquals或JUNIT测试中的任何其他方式比较两个对象?

时间:2014-03-10 13:41:13

标签: java json testing junit

下面是我编写的JUNIT测试,用于比较Json字符串中创建的对象(Actual)和测试函数中创建的对象(Expected)。

    @Test
    public void testSalesChannel_1_ObjSrc(){

    SalesChannel oScExpected = new SalesChannel();
    oScExpected.setSalesChannelId(79662);
    oScExpected.setCompanyName("BMW");
    oScExpected.setCountry("DE");
    oScExpected.setActive(true);

    String jsonStringActual = "{\"salesChannelId\":79662,"
            + "\"companyName\":\"BMW\","
            + "\"country\":\"DE\",\"isActive\":true,"
            + "\"salesChannelContact\":[]}";
    SalesChannel oScActual = gson.fromJson(jsonStringActual, SalesChannel.class);
    System.out.println(oScExpected.toString());
    System.out.println(oScActual.toString());
    //assertEquals(oScExpected, oScActual); 
    assertTrue(oScExpected.equals(oScActual));      
}

但是当我执行assertEquals()时,它无法通过测试。可能是什么原因?

我的销售渠道类是:

package com.pf.activationServer;

import java.util.List;

import com.pf.activationServer.SalesChannelContact;

public class SalesChannel {

private int salesChannelId;
private String companyName;
private CountryCode country;
private boolean isActive;
private List<SalesChannelContact> salesChannelContact;

// getter methods
protected int getSalesChannelId() {
    return salesChannelId;
}
protected String getCompanyName() {
    return companyName;
}
protected CountryCode getCountry() {
    return country;
}
protected boolean isActive() {
    return isActive;
}
protected List<SalesChannelContact> getSalesChannelContact() {
    return salesChannelContact;
}

// setter methods
protected void setSalesChannelId(int salesChannelId) {
    this.salesChannelId = salesChannelId;
}
protected void setCompanyName(String companyName) {
    this.companyName = companyName;
}
protected void setCountry(String a){
    this.country = CountryCode.valueOf(a);
}
protected void setActive(boolean isActive) {
    this.isActive = isActive;
}
protected void setSalesChannelContact(List<SalesChannelContact> salesChannelContact) {
    this.salesChannelContact = salesChannelContact;
}

// Checks whether two SalesChannel objects are equal or not

public boolean equals(SalesChannel other) {
    if (this == other)
        return true;
    if (other == null)
        return false;
    if (getClass() != other.getClass())
        return false;
    //SalesChannel other = (SalesChannel) obj;
    if (companyName == null) {
        if (other.companyName != null)
            return false;
    } else if (!companyName.equals(other.companyName))
        return false;
    if (country != other.country)
        return false;
    if (isActive != other.isActive)
        return false;
    if (this.salesChannelContact == null) {
        if (other.salesChannelContact != null)
            return false;
    } else if (!salesChannelContact.equals(other.salesChannelContact))
        return false;
    if (salesChannelId != other.salesChannelId)
        return false;
    return true;
}
    @Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((companyName == null) ? 0 : companyName.hashCode());
    result = prime * result + ((country == null) ? 0 : country.hashCode());
    result = prime * result + (isActive ? 1231 : 1237);
    result = prime
            * result
            + ((salesChannelContact == null) ? 0 : salesChannelContact
                    .hashCode());
    result = prime * result + salesChannelId;
    return result;
}
}   // END class SalesChannel

4 个答案:

答案 0 :(得分:3)

你的equals方法使用的是特定的类而不是Object。

您需要使用自己的实现覆盖equals(Object obj)方法。

如果你首先执行类型检查,然后调用你实现的等于类,你应该有更多的运气。

assertEquals正在调用超类的equals(Object obj)方法(在您的情况下为Object),默认情况下只是比较对象的引用。因为它们不是同一个对象,所以结果会失败。

所以,如果你在解释者看到它的时候看它。

public class SalesChannel extends Object
{
}

public class Object
{
    public boolean equals(Object obj)
    {
        return this == obj;
    }
}

所以要解决它

public class SalesChannel 
{
    @Override public boolean equals(Object obj)
    {
        if (obj != null && obj.isInstance(SalesChannel.class))
            return this.equals((SalesChannel) obj);
        return false;
    }
}

答案 1 :(得分:2)

@Test
public void testMyClass(){

    MyClass objExpected = new MyClass();
    objExpected.setMyClasslId(79662);
    objExpected.setMyClassCompanyName("BMW");
    objExpected.setCountry("DE");
    objExpected.setActive(true);

    String jsonStringActual = "{\"myClassId\":79662,"
            + "\"myClasscompanyName\":\"BMW\","
            + "\"country\":\"DE\",\"isActive\":true,"
            + "\"MyClassContacts\":[]}";
    MyClass objcActual = gson.fromJson(jsonStringActual, MyClass.class);        
    System.out.println(objExpected.toString());
    System.out.println(objActual.toString());
    assertEquals(objExpected, objActual);           
}

运行此代码并粘贴输入

答案 2 :(得分:-1)

检查POJO Myclass中的变量名称和类型,因为GSON建议使用相对于JSON的类的强名称和类型检查。

答案 3 :(得分:-1)

回答标题中的问题:为了比较2个对象的字段,请使用Unitils及其assertReflectionEquals