gpt4 book ai didi

java - 在 MRUnit 中收到意外输出

转载 作者:可可西里 更新时间:2023-11-01 14:33:46 24 4
gpt4 key购买 nike

我收到以下 MRUnit 错误:

ERROR mrunit.TestDriver: Received unexpected output (60, mrdp.MyCustomClass@73207f36)

ERROR mrunit.TestDriver: Missing expected output (60, mrdp.MyCustomClass@6f73cf45) at position 0

我创建了一个MyCustomClass,它实现了Writable,并且有4 个int 属性。这是我的映射器的输出值。

下面是mapper的MRUnit测试代码:

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

当在上面的 new Text("60,5596,1,256") 中定位“1”时,我的 Mapper 应该调用它的 setter setAttr1(1)

如何使用自定义类(具有多个属性)测试此结果?作业执行成功,只是不知道如何让MRUnit测试工作。

$ hadoop fs -cat patterns/minmaxcount/outuserprefs/part*
23 mrdp.MyCustomClass@4cf15f6c
60 mrdp.MyCustomClass@4cf15f6c

最佳答案

如果你想测试相等性,你需要为你的自定义类覆盖 equals()hascode()。如果你不这样做,就没有办法测试“语义平等”。将使用默认的 Object 方法。这就是你所面临的。如需进一步讨论,请参阅 Why do I need to override the equals and hashCode methods in Java?

下面是一个使用自定义类 CustomClass 的简单 JUnit 测试。我注释掉了 equalshashcode。如果您运行测试,它将失败,并显示与您收到的消息类似的消息。去掉注释再运行就可以通过了。

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 都可以选择为您创建它们。

  • Eclipse:右键单击类 -> 源代码 -> 生成等号和哈希码
  • Netbeans:右键单击源代码编辑器 -> 插入代码 -> equals() hashcode()

在这两种情况下,您都需要选择要包含(检查)在 equals 和 hashcode 中的属性。这些是我使用的仅有的两个 IDE :-)

关于java - 在 MRUnit 中收到意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25723526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com