2013-03-11 4 views
0

Я пытался запустить следующий тест, используя mockito и junit, и я продолжаю получать «java.lang.NullPointerException: имя не должно быть null» Может кто-нибудь сказать почему это происходит?Mockito & Junit null Указатель исключения: имя не должно быть 0:

На отладку, я обнаружил, что это исключение, когда тест выполняет следующую инструкцию в методе isStopValid (String):

FacilityValidationUtil facUtil = новый FacilityValidationUtil();

@RunWith(MockitoJUnitRunner.class) 
public class MyFormTest{ 
    @InjectMocks MyForm form = new MyForm(); 
    @Mock FacilityValidationUtil facUtil; 
    @Test 
    public void testIsStopValid() throws FinderException{ 
     when(facUtil.isFacilityValid("")).thenReturn(false); 
     form.setOrigin(""); 
     assertEquals(false, form.isStopValid(form.getOrigin()));   
    } 
} 

класса с методом для тестирования:

public class MyForm{ 
    FacilityValidationUtil facUtil = new FacilityValidationUtil(); 
    public boolean isStopValid(String stop){ 

     try { 
      return facUtil.isFacilityValid(stop); 
     } catch (FinderException e) { 
      log.error("Error finding the stop. "+e.getCause()); 
      return false; 
     } 
    } 
} 

public class FacilityValidationUtil{ 
    private FacilityDAO facilityDao = new HibernateFacilityDAO(); 
    public boolean isFacilityValid(String facility) throws FinderException{ 
     boolean test; 
     FacilityImpl facilityImpl = facilityDao.findFacilityByNassCode(facility); 
     test = (facilityImpl==null)?false : true; 
     return test; 
    } 
} 

public class HibernateFacilityDAO extends HibernateAbstractDeltaDAO implements FacilityDAO { 
    public HibernateFacilityDAO() { 
     super(false); 
    } 
} 
+0

Какая строка в 'testIsStopValid()' вызывает исключение? – Magnilex

+0

@MagnusTengdahl assertEquals (false, form.isStopValid (form.getOrigin())); Спасибо. – Susie

ответ

2

Короткий ответ: Вы пытаетесь дразнить переменную (facUtil), что является локальным для вашего isStopValid met hod, поэтому макет версии этого объекта в вашем тесте никогда не будет вызван, потому что вы «обновляете его» каждый раз.

Долгий ответ: похоже, вы пытаетесь высмеять вызов вашего класса FacilityValidationUtil, и если это так, то вам нужно либо сделать поле класса a так, чтобы Mockito мог вводить объект путем отражения (если этот объект является потокобезопасным, на что он похож) или изучите насмешливую инфраструктуру, такую ​​как PowerMockito, которая позволит вам издеваться над конструктором (google для PowerMockito при новом).

PowerMockito.whenNew(FacilityValidationUtil.class).withNoArguments().thenReturn(facUtil); 

Mockito по умолчанию не поддерживает насмешку конструкторов args.

EDIT Если у вас все еще есть проблемы, я бы предложил начать с меньшего примера. Я собрал один для вас, который работает и использует код, который вы пытаетесь проверить (он использует внутренние классы, хотя у Mockito есть некоторые причудливые правила, но я просто делаю это, чтобы сжать пример).

@RunWith(MockitoJUnitRunner.class) 
public class MyFormTest { 

@InjectMocks 
private MyForm form = new MyForm(); 
@Mock 
private FacilityValidationUtil facUtil; 

@Test 
public void testIsStopValid_false() { 
    when(facUtil.isFacilityValid("")).thenReturn(false); 
    assertEquals(false, form.isStopValid("")); 
} 

@Test 
public void testIsStopValid_true() { 
    when(facUtil.isFacilityValid("")).thenReturn(true); 
    assertEquals(true, form.isStopValid("")); 
} 

public class MyForm { 
    private FacilityValidationUtil facUtil = new FacilityValidationUtil(); 

    public boolean isStopValid(String stop) { 
     try { 
      return facUtil.isFacilityValid(stop); 
     } catch (FinderException e) { 
      return false; 
     } 
    } 
} 

public class FacilityValidationUtil { 
    public boolean isFacilityValid(String facility) throws FinderException { 
     throw new RuntimeException(facility); 
    } 
} 

public class FinderException extends RuntimeException { 
    public FinderException(String message) { 
     super(message); 
    } 
} 

}

Что действительно важно, что ваш макет не получает инъекции правильно. Пока вы не получите это решение, вы будете продолжать получать ту же ошибку. Установите точку останова в MyForm в точке, которую вы вызываете facUtil.isFaciltyValid, и посмотрите на объект. Это должен быть объект mockito, а не ваш класс.

Удачи.

+0

Я сделал facUtil объект класса. Я редактировал мой код выше. Я все равно получаю ту же ошибку. Странно, теперь все мои другие тесты терпят неудачу с той же ошибкой. – Susie

+0

Я просто добавил вам дополнительную информацию. Вы должны иметь возможность скопировать его в файл класса и попробовать его без особых проблем. Дай мне знать, если тебе еще понадобится помощь. – benkiefer

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