Java JUnit AsserQuals()由于数组上有额外的空格而失败

Java JUnit AsserQuals()由于数组上有额外的空格而失败,java,junit,Java,Junit,我的Junit测试在比较2个数组和其中的kafka生产者记录时失败。失败的原因是阵列后面有一个额外的空间 预期: java.util.ArrayList<[ProducerRecord(topic=producer-test, partition=null, headers=RecordHeaders(headers = [], isReadOnly = false), key=0, value=Message: test-message, Number: 0, timestamp=n

我的Junit测试在比较2个数组和其中的kafka生产者记录时失败。失败的原因是阵列后面有一个额外的空间

预期:

java.util.ArrayList<[ProducerRecord(topic=producer-test, partition=null, 
headers=RecordHeaders(headers = [], isReadOnly = false), key=0, 
value=Message: test-message,
Number: 0, timestamp=null), ProducerRecord(topic=producer-test, 
partition=null, headers=RecordHeaders(headers = [], isReadOnly = false), 
key=1, value=Message: test-message,
Number: 1, timestamp=null)]> 
java.util.ArrayList
实际:

java.util.ArrayList<[ProducerRecord(topic=producer-test, partition=null, 
headers=RecordHeaders(headers = [], isReadOnly = false), key=0, 
value=Message: test-message,
Number: 0, timestamp=null), ProducerRecord(topic=producer-test, 
partition=null, headers=RecordHeaders(headers = [], isReadOnly = false), 
key=1, value=Message: test-message,
Number: 1, timestamp=null)]>
java.util.ArrayList
IDE告诉我唯一的区别是在Expected中arrayList的末尾后面有一个空格,您可以通过突出显示末尾来查看。怎么回事

编辑:

下面是一些其他代码

List<ProducerRecord<Integer, TestObj>> history = producer.history();

    //To be inserted into expected
    TestObj obj0 = new TestObj("test-message", 0);
    TestObj obj1 = new TestObj("test-message", 1);

    //new arraylist is needed or else the lists have slightly different types for some reason
    List<ProducerRecord<Integer, TestObj>> expected = new ArrayList<ProducerRecord<Integer, TestObj>>(Arrays.asList(
            new ProducerRecord<Integer, TestObj>("producer-test", 0, obj0),
            new ProducerRecord<Integer, TestObj>("producer-test", 1, obj1)
    ));

    Assert.assertEquals("Sent didn't match expected!", expected, history);
List history=producer.history();
//要插入到预期的
TestObj obj0=新的TestObj(“测试消息”,0);
TestObj obj1=新的TestObj(“测试消息”,1);
//需要新的arraylist,否则由于某些原因,列表的类型略有不同
预期列表=新的ArrayList(Arrays.asList(
新生产记录(“生产商测试”,0,obj0),
新生产记录(“生产商测试”,1,obj1)
));
Assert.assertEquals(“发送的与预期的不匹配!”,预期的,历史记录);
Assert.assertEquals()
正在调用
预期的.equals(历史)

List.equals(对象o)
的定义如下:

比较指定对象与此列表是否相等。当且仅当指定对象也是列表、两个列表的大小相同且两个列表中所有对应的元素对相等时,返回true。(如果(e1==null?e2==null:e1.equals(e2)),则两个元素e1和e2是相等的。)换句话说,如果两个列表以相同的顺序包含相同的元素,则将它们定义为相等。此定义确保equals方法在列表接口的不同实现中正常工作

您是否为ProducerRecord类定义了
equals
方法


如果没有,则您的
ProducerRecord
对象将通过引用等式进行比较,这意味着只有在它们实际上是相同对象的情况下,才会对它们进行比较。由于您正在测试中构造新的
ProducerRecord
对象,因此它们将不具有引用相等性。

要比较两个对象或两个对象列表,您可以覆盖(等于)该对象的方法并比较该对象的所有元素。如果它们都匹配,则可以返回true表示相等。检查下面的示例:

public class Customer {
String name;
int age;

@Override
public boolean equals(Object obj) {
    if(this == obj)
        return true;

    // it checks if the argument is of the type Customer by comparing the classes
    // of the passed argument and this object.
    // if(!(obj instanceof Customer)) return false; ---> avoid.
    if(obj == null || obj.getClass()!= this.getClass())
        return false;

    // type casting of the argument.
    Customer customer = (Customer) obj;
    if(customer.getName().equals(this.name) &&
            (customer.getAge() == this.age))
        return true;

    return false;
}
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

预期输出是常数吗?为什么不能删除其中的尾随空格?我只是将一个数组插入到预期的和实际的数组中,每次测试都失败;我仔细检查了一下,它确实有一个equals()函数,唯一的区别是我的IDE告诉我,在预期的结尾有一点点空间。你能确认像
(new ProducerRecord(“producer test”,0,obj0)).equals(new ProducerRecord(“producer test,0,obj0))
这样的东西是真的吗?您的
TestObj
是否覆盖了
equals()
?结果表明,ProducerRecord有一个equals(),但失败了,因为我的TestObj没有equals()。这在使用Lombok Builder时对我有帮助。除了生成器,我还需要@EqualsAndHashCode。