下面是我编写的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
答案 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。