【问题标题】:Unsatisfied dependency expressed through field 'userService' in unit test通过单元测试中的字段“userService”表示不满足的依赖关系
【发布时间】:2020-06-22 05:32:07
【问题描述】:

在 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)

如何修复我的单元测试?

【问题讨论】:

  • 我认为AuditorAwareConfiguration 可以用不同的合成器来修复,@Configuration 之后有什么加载的吗?

标签: java spring spring-boot spring-security spring-data


【解决方案1】:

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

为什么它不起作用?

您应该在 @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 注释标记测试配置

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 2019-11-09
    • 2018-11-02
    • 2019-08-03
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2022-11-13
    • 2016-12-21
    相关资源
    最近更新 更多