Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JUNIT测试中,如何使用assertEquals或其他方法比较两个对象?_Java_Json_Testing_Junit - Fatal编程技术网

Java 在JUNIT测试中,如何使用assertEquals或其他方法比较两个对象?

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

下面是我编写的JUNIT测试,用于比较从Json字符串创建(实际)的对象和在测试函数中创建(预期)的对象

    @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;
    }
}