Исключение NullPointerException при попытке использовать макет для проверки использования метода

#java #unit-testing #nullpointerexception #mockito

#java #модульное тестирование #исключение nullpointerexception #mockito

Вопрос:

Я использую mockito для тестирования следующего метода.

 protected void mapSubEntitiesSourceColToSubEntitiesTargetCol(Source source, Target target) throws
    MapperCreationException, MappingException {
    Mapper<SourceSubEntity, TargetSubEntity> subEntitiesSourceColToSubEntitiesTargetColMapper = mapperFactory.createMapper(SourceSubEntity.class, TargetSubEntity.class);
    Collection<TargetSubEntity> mappedValue = new LinkedList<>();
    for (SourceSubEntity e : source.getSubEntitiesSourceCol()) {
        mappedValue.add(subEntitiesSourceColToSubEntitiesTargetColMapper.apply(e));
    }
    target.setSubEntitiesTargetCol(mappedValue);
}
  

и вот мой тест:

 @Test
public void TestMappingSubEntitiesSourceColToSubEntitiesTargetCol() throws 
MapperCreationException, MappingException {
    Source mockedSource = Mockito.mock(Source.class);
    Target mockedTarget = Mockito.mock(Target.class);
    SourceSubEntity sourceSubEntity = Mockito.mock(SourceSubEntity.class);
    TargetSubEntity targetSubEntity = Mockito.mock(TargetSubEntity.class);
    MapperFactory mapperFactory = Mockito.mock(MapperFactory.class);
    Mapper<SourceSubEntity, TargetSubEntity> subEntitiesSourceColToSubEntitiesTargetColMapper = mapperFactory.createMapper(SourceSubEntity.class, TargetSubEntity.class);

    Collection<SourceSubEntity> subEntitiesSourceCol = Arrays.asList(sourceSubEntity, sourceSubEntity);

    SourceToTargetMapper sttm = new SourceToTargetMapper(targetModelObjectFactory,mappingOperatorFactory,mapperFactory,valueProducerFactory);
    Mockito.when(mockedSource.getSubEntitiesSourceCol()).thenReturn(subEntitiesSourceCol);
    Mockito.when(subEntitiesSourceColToSubEntitiesTargetColMapper.apply(sourceSubEntity)).thenReturn((TargetSubEntity) Arrays.asList(targetSubEntity));

    sttm.mapSubEntitiesSourceColToSubEntitiesTargetCol(mockedSource,mockedTarget);
    Mockito.verify(mockedTarget, Mockito.times(1)).setSubEntitiesTargetCol(Mockito.any());
  

Проблема, с которой я сталкиваюсь здесь, заключается в том, что я получаю NullPointerException for subEntitiesSourceColToSubEntitiesTargetColMapper.apply(e) .

Как я могу избавиться от этого?

Комментарии:

1. В вашем тесте строка «Mapper<SourceSubEntity, TargetSubEntity> subEntitiesSourceColToSubEntitiesTargetColMapper = mapperFactory.createMapper(SourceSubEntity.class , TargetSubEntity.class );» возвращено значение null. Я полагаю, что вы имели в виду, что Mapper<SourceSubEntity, TargetSubEntity> subEntitiesSourceColToSubEntitiesTargetColMapper = Mockito.mock(Mapper.class ); а затем Mockito.when(mapperFactory.createMapper(SourceSubEntity.class , TargetSubEntity.class )).Затем возврат(subEntitiesSourceColToSubEntitiesTargetColMapper);

2. @Jayr да!! Это была моя проблема! Спасибо! Не могли бы вы объяснить мне, почему это правильный подход?

3. Поскольку mapperFactory является издевательским экземпляром, любые вызовы его функций должны возвращать значение null, пока вы не укажете им, что возвращать.