在mrunit中收到意外输出

h9vpoimq  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(378)

我得到以下mrunit错误:
错误mrunit.testdriver:收到意外输出(60,mrdp。mycustomclass@73207f36)
错误mrunit.testdriver:缺少预期输出(60,mrdp。mycustomclass@6f73cf45)位置0处
我创造了一个 MyCustomClass 哪个实现了 Writable ,并具有4个int属性。这是我的Map器的输出值。
以下是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();
}

我的制图员应该叫它的设定者 setAttr1(1) ,将“1”定位到 new Text("60,5596,1,256") 在上面。
如何使用自定义类(具有多个属性)测试此结果?作业执行成功了,我只是不知道如何让mrunit测试工作。

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

bvn4nwqk1#

你需要重写 equals() 以及 hascode() 对于自定义类,如果要测试是否相等。如果你不这样做,就没有办法测试“语义平等”。默认值 Object 将使用方法。这就是你要面对的。有关进一步的讨论,请参阅为什么需要重写java中的equals和hashcode方法?
下面是一个使用自定义类的简单junit测试 CustomClass . 我把那本书注解掉了 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都可以选择为您创建它们。
eclipse:右键单击class->source->generatequals和hashcode
netbeans:右击source editor->insert code->equals()hashcode()
在这两种情况下,都需要选择要在equals和hashcode中包含(检查)的属性。这是我使用的仅有的两个IDE:-)

相关问题