Java JUnit AsserQuals()由于数组上有额外的空格而失败
我的Junit测试在比较2个数组和其中的kafka生产者记录时失败。失败的原因是阵列后面有一个额外的空间 预期: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
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。