当前位置: 首页 > 知识库问答 >
问题:

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

乐正心思
2023-03-14

下面是我写的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

共有3个答案

邢硕
2023-03-14

回答标题中的问题:为了比较2个对象的字段,使用Unitils和它的断言。

糜雪峰
2023-03-14

equals方法使用的是特定的类,而不是对象。

您需要用自己的实现重写equals(Object obj)方法。

如果您首先执行类型检查,然后调用实现的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;
    }
}
曾河
2023-03-14
@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);           
}

运行此代码并粘贴输入

 类似资料:
  • 问题内容: 我正在尝试摆脱Java的困扰。单元测试对我来说非常重要,因此最近我开始使用JUnit。一开始很难,但我已经掌握了。至此为止,我所有的测试都进行了工作,除了比较相同类的两个对象(我没有尝试测试创建不同类的对象的函数)。基本上,当我在类中有一个创建该类新实例的方法并尝试测试该方法时,会收到一个奇怪的错误。 “预期:runnersLog.MTLog@433c675d,但是是runnersLo

  • 在一个JUnit4测试中,我有一个方法,它返回一个对象,我要将它与引用列表进行比较。到目前为止,我发现的最佳解决方案是使用和,如下所示: 对于只返回很少值的测试来说,这是很好的。但是如果一个测试返回更多的值,这肯定不是最好的方法。 我还尝试了下面的代码。要编译代码,需要在之前向下转换到: 对比失败了,不明白为什么: java.lang.AssertionError:预期:(包含<[<0.2>的<1

  • 问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:

  • 问题内容: 我有两个像这样的对象数组: 我想知道数组是否相等。我定义的是相等的,因为array1中的每个值都与array2中该位置的值相同。因此,这两个数组将相等。 为什么最好找出这两个数组是否相等? 不是一个很深的等式,所以它是行不通的,我不知道是否遍历每个元素并进行比较是解决此问题的最佳,最有效的方法。有没有人有更好的建议? 编辑:我需要一个可以放入嵌套数组的等于。 问题答案: 使用。这项功能

  • 我已经浏览了Python文档提供的信息,但我仍然有点困惑。有人可以发布示例代码来编写一个新文件,然后使用pickle将字典转储到其中吗?

  • 问题内容: 这是一个简单的问题-给定两个URL,是否有一些内置方法或一个Apache库来确定它们在逻辑上是否相等? 例如,这两个URL相等: 问题答案: 尽管(以及有问题的)这些特定示例 未 返回,但我认为这是唯一可以假定等效的情况(因为HTTP协议中没有空路径)。 这些URI 并且可以 不 被认为是等价的。 也许您可以使用包装在实用程序中的方法来显式处理此特定情况。