Неудовлетворенная зависимость выражается через поле 'userService' в модульном тесте - PullRequest
0 голосов
/ 10 марта 2020

В приложении с весенней загрузкой у меня есть AuditorAwareInterface, который использует @Autowired userService.

Это выглядит так:


@Configuration
public class AuditorAwareConfiguration {

    @Bean
    public AuditorAware<Long> auditorAware() {
        return new AuditorAware<Long>() {

            @Autowired
            private UserService userService;

            @Override
            public Long getCurrentAuditor() {
                SecurityContext ctx = SecurityContextHolder.getContext();
                Authentication authentication = ctx.getAuthentication();

                if (authentication == null || !authentication.isAuthenticated()) {
                    return null;
                }

                User user = null;
                Object principal = authentication.getPrincipal();

                if (principal.getClass().equals(User.class)) {
                    user = (User) principal;
                } else if (principal.getClass().equals(InetOrgPerson.class)) {
                    UserDetails userDetails = (UserDetails) principal;
                    String username = userDetails.getUsername();
                    UserDTO cond = new UserDTO();
                    cond.setUsername(username);
                    user = userService.findBasicOne(cond);
                }

                if (null == user) {
                    return null;
                }

                return user.getId();
            }
        };
    }
}

Работает нормально, но в пределах тест модуля контроллера, у меня появляется следующая ошибка:

Error creating bean with name 'auditorAware': Unsatisfied dependency expressed through field 'userService';

Я попытался инициализировать контекст в моем тесте, используя @ContextConfiguration:

@ContextConfiguration(classes = {
        CompanyManagement.class,
        CompanyManagementConfig.class,
        CompanyController.class,
+        UserService.class,
}, initializers = ConfigFileApplicationContextInitializer.class)

Как я могу исправить свой модуль тестовое задание?

1 Ответ

0 голосов
/ 10 марта 2020

Прежде всего, это не модульный тест. Это интеграционный тест.

Почему он не работает?

Вы должны указывать внутри @ContextConfiguration только файлы конфигурации, например. файлы, которые содержат объявления бина.

Как исправить?

Создайте отдельный файл конфигурации, который будет использоваться для этого конкретного интеграционного теста (должен быть в src/test/)

Если UserService имеет аннотацию @Component (или один из дочерних элементов) и создан при сканировании компонента:

  @ComponentScan({"package where UserService class located"})    
  public class SomeSpecificIntergarionTestConfig {
  }

Если UserService создан в некоторой из java -конфигураций явно:

public class SomeSpecificIntergarionTestConfig {
    @Bean
    public UserService userService{
      return new UserService();
    }
}

Затем добавьте этот конфиг в контекстную аннотацию конфигурации:

@ContextConfiguration(classes = {
 SomeSpecificIntergarionTestConfig.class,
 rest of configs. 
})

Важно : чтобы избежать проблем со сканированием компонентов, лучше не отмечать тестовые конфигурации аннотацией @Configuration

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