首页 > 解决方案 > 通过单元测试中的字段“userService”表示不满足的依赖关系

问题描述

在 Spring Boot 应用程序中,我有一个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)

如何修复我的单元测试?

标签: javaspringspring-bootspring-securityspring-data

解决方案


首先,它不是单元测试。这是一个集成测试。

为什么它不起作用?

您应该在 @ContextConfiguration 中仅指定配置文件,例如。包含 bean 声明的文件。

怎么修?

创建一个单独的配置文件,用于特定的集成测试(应该在 下src/test/

如果 UserService 具有@Component注释(或其中一个子项)并由组件扫描创建:

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

如果在某些 java-config 中显式创建了 UserService:

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

然后将此配置添加到上下文配置注释中:

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

重要:为避免组件扫描问题,最好不要使用@Configuration注释标记测试配置


推荐阅读