Введите бобы в макеты, созданные с помощью mockito - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время у меня возникли некоторые проблемы с библиотекой mockito ... точнее, я не могу внедрить bean-компонент userRepository в мой смоделированный сервис.Для внедрения зависимостей я использую Spring Boot.Ниже приведены примеры кода:

@Service
public class UserService {

     @Autowired private TokenService tokenService;
     @Autowired private UserRepository userRepository;

     public User updateUser(User user) {
         validateUser(user); // can throw some validation errors
         createToken(user); // creates token to my user
         return userRepository.save(user);
      }
}

В моем методе тестирования я хочу пропустить проверку и создание токена до обновления пользователя.

UserService userService = mock(UserService.class);
doNothing(userService).validateUser(any());
doNothing(userService).createToken(any());

Таким образом, проблема возникает вмой тестовый метод, когда я вызываю метод updateUser, он терпит неудачу, потому что мой userRepository не внедряется (NullPointerException).Я пробовал с @Mock и @InjectMocks, но эти аннотации используются для введения макетов.Как я могу ввести настоящий боб в мой макет?Возможно ли это с помощью mockito?Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

В настоящее время вы высмеиваете службу, что означает, что вы заменяете весь экземпляр фиктивным объектом, даже полями.Если вас интересует частичная имитация (потому что вы хотите использовать настоящие бины внутри), вы должны прочитать о шпионаже (@Spy принимает реальный объект, но позволяет выполнять частичную имитацию).

Я не уверен, что вы пытаетесь сделать, но я советую создать SpringBootTest (который загружает контекст приложения и создает все компоненты), шпионить за компонентом UserService и в конечном итоге высмеивать поведение сервиса, которое вы делаете сейчас.

Я никогда не пробовал шпионить бобы, но я нашел кое-что: https://shekhargulati.com/2017/07/20/using-spring-boot-spybean/

0 голосов
/ 22 мая 2018

Идея Mockito состоит в том, чтобы макетировать точки интеграции, в основном любые сторонние вызовы, которые вы делаете, чтобы вы могли проверить свою единицу кода.Примерно так: если все остальное, с чем я общаюсь, работает, то мой код также должен работать.

Имея это в виду, я не думаю, что вам следует использовать mockito для сохранения сущности в базе данных.Если вам нужно что-то сохранить в БД, попробуйте написать интеграционный тест, вы можете использовать конфигурацию Spring для предоставления реальных компонентов в этом случае.

Сказав, что, если вам действительно нужно это сделать, вы можете использовать ReflectionTestUtils.setField весной или Whitebox.setInternalState(userService, "userRepository", userRepository) для мокито.

...