Java 在JUNIT测试中,如何使用assertEquals或其他方法比较两个对象?
下面是我编写的JUNIT测试,用于比较从Json字符串创建(实际)的对象和在测试函数中创建(预期)的对象Java 在JUNIT测试中,如何使用assertEquals或其他方法比较两个对象?,java,json,testing,junit,Java,Json,Testing,Junit,下面是我编写的JUNIT测试,用于比较从Json字符串创建(实际)的对象和在测试函数中创建(预期)的对象 @Test public void testSalesChannel_1_ObjSrc(){ SalesChannel oScExpected = new SalesChannel(); oScExpected.setSalesChannelId(79662); oScExpected.setCompanyName("BMW"); oScEx
@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
package com.pf.activationServer;
导入java.util.List;
导入com.pf.activationServer.SalesChannelContact;
公共类销售渠道{
私有int salesChannelId;
私有字符串companyName;
私人国家代码国家;
私有布尔非活动;
私人名单联系人;
//吸气剂法
受保护的int-getSalesChannelId(){
返回salesChannelId;
}
受保护的字符串getCompanyName(){
返回公司名称;
}
受保护的国家代码getCountry(){
返回国;
}
受保护的布尔isActive(){
回报是积极的;
}
受保护列表getSalesChannelContact(){
返回销售渠道联系人;
}
//setter方法
受保护的无效setSalesChannelId(int-salesChannelId){
this.salesChannelId=salesChannelId;
}
受保护的无效setCompanyName(字符串companyName){
this.companyName=companyName;
}
受保护的国家/地区(字符串a){
this.country=CountryCode.valueOf(a);
}
受保护的void setActive(布尔值isActive){
this.isActive=isActive;
}
受保护的无效setSalesChannelContact(列出salesChannelContact){
this.salesChannelContact=salesChannelContact;
}
//检查两个SalesChannel对象是否相等
公共布尔等于(SalesChannel其他){
if(this==其他)
返回true;
如果(其他==null)
返回false;
如果(getClass()!=other.getClass())
返回false;
//SalesChannel其他=(SalesChannel)obj;
if(companyName==null){
if(other.companyName!=null)
返回false;
}else如果(!companyName.equals(other.companyName))
返回false;
如果(国家!=其他国家)
返回false;
if(isActive!=其他.isActive)
返回false;
if(this.salesChannelContact==null){
if(other.salesChannelContact!=null)
返回false;
}else如果(!salesChannelContact.equals(other.salesChannelContact))
返回false;
if(salesChannelId!=其他.salesChannelId)
返回false;
返回true;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果
+((companyName==null)?0:companyName.hashCode();
result=prime*result+((country==null)?0:country.hashCode();
结果=素数*结果+(isActive?1231:1237);
结果=素数
*结果
+((salesChannelContact==null)?0:salesChannelContact
.hashCode());
结果=主要*结果+salesChannelId;
返回结果;
}
}//终端类SalesChannel
运行此代码并粘贴您的输入检查POJO Myclass中的变量名称和类型,因为GSON建议对与JSON相关的类进行强名称和类型检查。您的equals方法使用的是特定类,而不是对象 您需要用自己的实现重写equals(objectobj)方法 如果您首先执行类型检查,然后调用实现的equals类,那么您应该会更幸运 assertEquals正在调用超类(在您的案例对象中)的equals(Object obj)方法,默认情况下,该方法只比较对象的引用。因为它们不是同一个对象,所以结果将失败 所以,如果你像译员看到的那样看它
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;
}
}
回答标题中的问题:为了比较两个对象的字段,请使用Unitils和its。@sp00m,我能得到您的帮助吗!我是否应该编写equals方法并作为:assertTrue(Expected.equals(Actual));我编辑了我的答案。在com.pruftechnik.activationServer.salesschannel中生成字符串/equals和hashCode方法并运行它again@Amir关于equals()方法:在我看来,当您在java中创建任何新类时,您应该生成一些东西来避免将来的麻烦:getter、setter、默认构造函数、equals和hashCode。为了便于调试,您还可以创建toString。在Eclipse中,您可以使用ALT+SHIFT+s自动执行此操作,并且可以从将出现的菜单中选择所需内容。当比较两个对象的SalesChannelContact时,equal方法返回false,因为在本例中这两个对象都为null,但它返回false而不是true!更改此:私人列表salesChannelContact;对此:私有列表salesChannelContact=new ArrayList();然后再次粘贴输出并
返回此.equals((SalesChannel)obj)代码>是一个很棒的双关语!
public class SalesChannel
{
@Override public boolean equals(Object obj)
{
if (obj != null && obj.isInstance(SalesChannel.class))
return this.equals((SalesChannel) obj);
return false;
}
}