我收到以下MRUnit错误:
ERROR mrunit.TestDriver:收到意外的输出(60,mrdp.MyCustomClass@73207f36)
错误mrunit.TestDriver:在第0位错过预期输出(60,mrdp.MyCustomClass @ 6f73cf45)
我创建了一个实现MyCustomClass
的{{1}},并且有4个int属性。这是我的Mapper的输出值。
以下是映射器MRUnit测试的代码:
Writable
在上面@Test
public void testMapper() throws IOException {
MyCustomClass result = new MyCustomClass();
result.setAttr1(1);
result.setAttr2(0);
result.setAttr3(0);
result.setAttr4(0);
mapDriver.withInput(new LongWritable(1), new Text("60,5596,1,256"));
mapDriver.addOutput(new Text("60"), result);
mapDriver.runTest();
}
中找到“1”时,我的Mapper应调用其setter setAttr1(1)
。
如何使用自定义类(具有多个属性)测试此结果?作业执行成功,我只是不知道如何使MRUnit测试工作。
new Text("60,5596,1,256")
答案 0 :(得分:2)
如果要测试相等性,则需要覆盖自定义类的equals()
和hascode()
。如果不这样做,就无法测试“语义相等”。将使用默认的Object
方法。这就是你所面对的。有关进一步的讨论,请参阅Why do I need to override the equals and hashCode methods in Java?
使用自定义类CustomClass
进行简单的JUnit测试。我评论了equals
和hashcode
。如果您运行测试,它将失败,并显示与您收到的内容类似的消息。如果删除注释并运行它,它将通过。
import static org.junit.Assert.*;
import org.junit.Test;
public class CustomClass {
String firstName;
String lastName;
public void setFirstName(String firstName) { this.firstName = firstName; }
public void setLastName(String lastName) { this.lastName = lastName; }
@Test
public void testEqaulity() {
CustomClass clazz1 = new CustomClass();
clazz1.setFirstName("Stack");
clazz1.setLastName("Overflow");
CustomClass clazz2 = new CustomClass();
clazz2.setFirstName("Stack");
clazz2.setLastName("Overflow");
assertEquals(clazz1, clazz2);
}
/*
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result
+ ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CustomClass other = (CustomClass) obj;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
*/
}
如果您没有实施这些方法的经验或知识,大多数IDE都可以选择为您创建它们。
在这两种情况下,您都需要在equals和hashcode中选择要包含(检查)的属性。这是我使用的唯一两个IDE: - )