2015-06-18 2 views
2

Я использую аннотацию @Mock(answer=Answers.RETURNS_SMART_NULL) с Mockito 1.9.5, чтобы получить некоторое исключение SmartNullPointerException, когда происходят неожиданные макетные вызовы.Mockito RETURNS_SMART_NULLS ответить странное поведение

К сожалению, тест проходит, даже не высмеивая хотя бы один важный вызов. Чтобы был ясен: Моя точка не найти сам, что я пропускаю но неудачу Тест потому я не издеваться методами. Я хотел бы сделать это без использования Mockito.verifyNoMoreInteractions(...)

Мой тест:

@RunWith(MockitoJUnitRunner.class) 
public class ContextServiceImplTest { 

    @Mock(answer = Answers.RETURNS_SMART_NULLS) 
    private IAccountDAO accountDaoMock; 
    @Mock(answer = Answers.RETURNS_SMART_NULLS) 
    private IRuleService ruleServiceMock; 
    @Mock(answer = Answers.RETURNS_SMART_NULLS) 
    private ISensorDAO sensorDAOMock; 

    private ContextServiceImpl contextService; 

    @Before 
    public void before() { 
     contextService = new ContextServiceImpl(accountDaoMock, ruleServiceMock, sensorDAOMock); 
    } 

    @Test 
    public void fillSensor() throws Exception { 
     // given 
     String givenSensorId = "123" 
     final EventDTO givenEvent = new EventDTO(); 
     givenEvent.setSensorId(givenSensorId) 

     // when 
     final Context context = contextService.getContext(givenEvent); 

     // then (should fail and throw explicit exception 

    } 

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

public class ContextServiceImpl { 
    ... 

    public Context getContext(final EventDTO event) throws Exception { 
     final String sMethodName = "getContext"; 
     final String sensorId = event.getSensorId(); 
     Context context = new Context(); 

     try { 
      final Sensor sensor = sensorDAO.findById(sensorId); 
      context.setSensor(sensor); 
      return context; 
     } catch (final NoResultException nre) { 
      throw new BusinessException(ValidationCode.UNSUPPORTED_VALUE, "sensorId"); 
     } catch (final PersistenceException pe) { 
      throw new TechnicalException(TechnicalCode.DATABASE_ACCESS_PROBLEM); 
    } 
} 

Спасибо за ваши комментарии/советы/explainations.

+1

Вам не нужно использовать '@ Before', чтобы вводить ваши mocks; вы можете просто использовать '@ InjectMocks' в поле для этого. – Makoto

ответ

1

Чтобы тест не прошел, вам необходимо позвонить по методу null объекта sensor.

Похоже, вы никогда не используете объект nullsensor. Это означает, что вы не получите любой NullPointerExceptions (умный или нет)

вы могли бы сделать

AssertEquals(context.getSensor().someMethod(), expectedResult); 

или просто

context.getSensor().someMethod(); 

получить исключение. Но

AssertNotNull(context.getSensor()); 

не будет достаточно, чтобы получить SmartNullPointerException

+0

Хорошо, я больше понимаю, что не работает с моим ожиданием. Но даже при вызове Sensor, например 'AssertEquals' или' context.getSensor.toString() 'Я получаю исключение NullPointerException, а не умное (так что нет никакой подсказки о том, что ожидания по макету отсутствуют ... –

+0

См. Http: //docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Mockito.html#RETURNS_SMART_NULLS в документации говорится: «Если тип возврата« final », то возвращается пустой null» –

+0

Да, я начал с этого , но в моем случае ни один из этих классов не кажется окончательным. Например, 'public class Sensor {...}' –

1

Ваши тесты еще пройти, потому что вы ничего с результатом какой-либо из этих вызовов не издевался вызова.

RETURNS_SMART_NULLS только бросает SmartNullPointerException, если вы попытаетесь разыменовать что-то SmartNull. В сущности, это говорит вам, что вы разыскиваете значение null более дружелюбным способом, и вы не делаете этого с вашим текущим кодом.

Во-первых - вы новичок в Context. Если вы не попадаете в проблемы сорняков, это никогда не вернется null.

Далее - вы проходите в новом EventDTO. По тем же причинам, указанным выше, это также не будет null.

Результат sensorможет быть null, но это не имеет значения - вы просто пропуская его через к context, не прибегая к какой-либо логики на нем.

Я не уверен, что RETURNS_SMART_NULLS будет работать лучше всего для вашего сценария. Я бы рекомендовал удалить эти ответы из макетных объектов. Это приведет к сбою теста, потому что вы не ожидали какого-либо из этих взаимодействий.

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