在单元测试中通过字段“ userService”表示不满意的依赖性

时间:2020-03-10 10:20:22

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

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

如何修复单元测试?

1 个答案:

答案 0 :(得分:0)

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

为什么不起作用?

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