Reputation: 685
Below is JUNIT test which I have written to compare the object created (Actual) from the Json string and the object created (Expected) within the test function.
@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));
}
BUT when I execute assertEquals(), it fails the test. What could be the reason?
AND my Sales Channel class is:
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
Upvotes: 7
Views: 37332
Reputation: 15308
Answering the question in title: in order to compare fields of 2 objects use Unitils and its assertReflectionEquals.
Upvotes: 0
Reputation: 5845
Your equals method is using a specific class and not Object.
You need to override the equals(Object obj) method with your own implementation.
If in that you first perform typechecking, and then call your implemented equals class you should have more luck.
assertEquals is calling the equals(Object obj) method of the super class (in your case Object) which by default just compares the reference of the object. As they are not the same object your result will fail.
So if you look at it as the interpreter sees it.
public class SalesChannel extends Object
{
}
public class Object
{
public boolean equals(Object obj)
{
return this == obj;
}
}
So to fix it
public class SalesChannel
{
@Override public boolean equals(Object obj)
{
if (obj != null && obj.isInstance(SalesChannel.class))
return this.equals((SalesChannel) obj);
return false;
}
}
Upvotes: 4
Reputation: 4696
@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);
}
Run this code and paste your input
Upvotes: 6
Reputation: 195
Check your variable names and types in POJO Myclass as GSON recommends strong name and type checking of class relative to JSON.
Upvotes: -1