在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)
如何修复单元测试?
答案 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
批注标记测试配置