无法在测试类

时间:2015-09-28 14:23:27

标签: spring-mvc spring-boot autowired intellij-14

我有一个Spring MVC和Spring Boot的项目,我使用IntelliJ。 我的项目是这样的:

main -> java -> mypackage -> authentification -> WebSecurityConfig.java
                          -> configuration -> ApplicationConfiguration.java
                          -> controller -> WelcomeMessageController.java
                          -> service -> WelcomeMessageService.java
                                     -> Impl -> WelcomeMessageServiceImpl.java
test -> java -> mypackage -> WelcomeMessageTest.java

我使用@Service注释服务实现。

我用

注释配置文件
@Configuration
@ComponentScan(basePackages = "mypackage")

在控制器中,我用

注入服务
@Autowired
WelcomeMessageService welcomeMessageService;

在测试类中,我使用相同的注释注入相同的服务:

@Autowired
WelcomeMessageService welcomeMessageService;

我用以下内容注释测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationConfiguration.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration

在控制器中,注射工作正常,但在测试类中,IntelliJ说:

  

无法自动装配。找不到WelcomeService类型的bean。

当我运行测试时,它可以工作,但我不明白为什么IntelliJ说它找不到bean。

我发现这个主题说它在IntelliJ上发生了一段时间,但我不想使用@SuppressWarnings注释。

有没有人有其他解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:0)

我遇到了无法将AutowWire bean引入Integration测试类的问题。你的问题通过添加" ContextConfiguration"帮助我解决这个问题。 annocation而不是" SpringApplicationConfiguration"我正在使用它。

然而,我现在唯一的区别是你缺少Application类中的@EnableAutoConfiguration(扩展SpringBootServletInitializer)或者你的@Configuration类。

希望这可以解决您的问题。底线是在这种非常具体的情况下导致不适当的注释。

答案 1 :(得分:0)

对我来说,这是一个组件扫描问题,我的模型位于单独的模块,然后是我的Spring Boot App。通常情况下, @SpringBootApplication 有一个 @ComponentScan ,未指定时会按如下方式扫描:

  
      
  • {@link #basePackageClasses}或{@link #basePackages}(或   可以指定其别名* {@link #value})来定义特定的   包扫描。如果未定义特定*包,则扫描   将从声明这个的*类的包中发生   注释

  •   

如果您的SpringBootApp Main类位于不同的包上,那么您需要指定ComponentScan。如果您使用多个模块,请在Configuration类中指定它。

Config class Annotations:

@Configuration
@ComponentScan(basePackages = "app.data")

Testclass Annotations:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { PropertyPlaceholderAutoConfiguration.class, DynamoConfig.class })