2014-09-08 4 views
3

Я получаю следующее сообщение об ошибке MRUnit:Получен неожиданный выход в MRUnit

ERROR mrunit.TestDriver: Received unexpected output (60, [email protected])

ERROR mrunit.TestDriver: Missing expected output (60, [email protected]) at position 0

Я создал MyCustomClass, который реализует Writable, и имеет 4 ИНТ атрибуты. Это значение вывода моего 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(); 
} 

Мой Mapper должен вызвать его сеттер setAttr1(1), при размещении «1» в new Text("60,5596,1,256") здесь выше.

Как я могу проверить этот результат с помощью пользовательского класса (с несколькими атрибутами)? Выполнение задания выполнено успешно, я просто не знаю, как сделать работу MRUnit.

$ hadoop fs -cat patterns/minmaxcount/outuserprefs/part* 
23 [email protected] 
60 [email protected] 

ответ

2

Вы должны переопределить equals() и hascode() для пользовательских классов, если вы хотите проверить на равенство. Если вы этого не сделаете, нет возможности проверить «семантическое равенство». Используются методы по умолчанию Object. Это то, с чем вы сталкиваетесь. Дальнейшее обсуждение см. В Why do I need to override the equals and hashCode methods in Java?

Ниже простого теста 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: щелкните правой кнопкой мыши на классе -> Источник -> Генерация равных и хэш-код
  • Netbeans: щелкните правой кнопкой мыши на редакторе исходного кода -> Вставить код -> равен() хэш-код()

В в обоих случаях вам нужно выбрать свойства, которые вы хотите включить (проверить) в equals и hashcode. Это единственные два IDE, которые я использую :-)

+1

Спасибо, действительно, ваш ответ помог мне найти «assertThat()» для тестов MRUnit. Нашли несколько примеров в http://java.dzone.com/articles/testing-mapreduce-mrunit – guzu92

Смежные вопросы