Юнит тест. Проблема при преобразовании сущности в DTO с использованием библиотеки ModelMapper - PullRequest
0 голосов
/ 15 января 2019

Я работаю над веб-приложением Spring Boot, и у меня есть пользовательская реализация библиотеки ModelMapper, которая позволяет мне преобразовывать отдельные объекты и список объектов.

@Component
public class ObjectMapperUtils {

@Autowired
private static ModelMapper modelMapper;

static {
    modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
}

private ObjectMapperUtils() {
}

public <D, T> D map(final T entity, Class<D> outClass) {
    return modelMapper.map(entity, outClass);
}

public <D, T> List<D> mapAll(final Collection<T> entityList, Class<D> outCLass) {
    return entityList.stream().map(entity -> map(entity, outCLass)).collect(Collectors.toList());
}
}

На уровне службы у меня есть метод возврата из объекта DB UserEntity и преобразование его в UserDTO.

@Autowired
private UserRepository userRepository;

@Autowired
private ObjectMapperUtils modelMapper;

@Override
public UserDTO getByUserId(String userId) {
    UserEntity userEntity = userRepository.findByUserId(userId)
            .orElseThrow(() -> new NotFoundException("User with userId[" + userId + "] not found"));
    //UserDTO userDTO = new UserDTO();
    //BeanUtils.copyProperties(userEntity, userDTO);
    return modelMapper.map(userEntity, UserDTO.class); // userDTO;
}

Проблема возникает, когда я пытаюсь создать тест для этого метода. UserDTO всегда возвращается как значение NULL.

class UserServiceImplTest {

@InjectMocks
private UserServiceImpl userService;

@Mock
private UserRepository userRepository;

@Mock
private ObjectMapperUtils modelMapper;

@BeforeEach
void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

@Test
void testGetByUserId() {
    UserEntity userEntity = new UserEntity();
    userEntity.setId(1L);
    userEntity.setUsername("zavada");
    userEntity.setUserId("33b4c069-e907-45a9-8d49-2042044c56e0");

    when(userRepository.findByUserId(anyString()))
                 .thenReturn(Optional.of(userEntity));

    UserDTO userDTO = userService.getByUserId("33b4c069-e907-45a9-8d49-2042044c56e0");
    System.out.println(userDTO); <--- NULL

    assertEquals("zavada", userDTO.getUsername());
    assertNotNull(userDTO);

}
}

Когда я использую на сервисном уровне преобразование BeanUtils.copyProperties (obj1, obj2); - тест успешно пройден. С ModelMapper я получаю NULL. Есть идеи, как решить эту ошибку или рефакторинг кода? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Чтобы получить ответ user268396, вам потребуется следующее, чтобы это заработало:

@RunWith(MockitoJUnitRunner.class)
    public class StackOverflowTest {

        @InjectMocks
        private StackOverflow userService = new StackOverflow();

        @Mock
        private UserRepository userRepository;

        @Mock
        private ObjectMapperUtils modelMapper;
        private UserDTO userDTO = new UserDTO();
        private UserEntity userEntity = new UserEntity();

        @Before
        public void setUp() {
            when(modelMapper.map(any(), any())).thenReturn(userDTO);

            userDTO.setId(1L);
            userDTO.setUsername("zavada");
            userDTO.setUserId("33b4c069-e907-45a9-8d49-2042044c56e0");
        }

        @Test
        public void testGetByUserId() throws Throwable {
            when(userRepository.findByUserId(anyString())).thenReturn(Optional.of(userEntity));

            UserDTO result = userService.getByUserId("33b4c069-e907-45a9-8d49-2042044c56e0");
            System.out.println(result);

            assertEquals("zavada", result.getUsername());
            assertNotNull(result);

        }
    }

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

0 голосов
/ 15 января 2019

Если у вас есть @Mock private ObjectMapperUtils modelMapper;, то по умолчанию у вас нет действительного ObjectMapperUtils. Таким образом, вы не вызываете свою реализацию, вы вызываете заглушки по умолчанию, которые предоставляет вам Mockito. Вот почему вы получаете null возвращаемое значение от modelMapper.map().

Либо не насмехайтесь над компонентом ObjectMapperUtils, либо организуйте для него что-нибудь подходящее, используя when() и т. Д. Из API Mockito.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...