Spring Boot测试没有从同级包中找到bean

时间:2019-01-30 16:05:23

标签: java spring spring-boot spring-test spring-ioc

我有一个@SpringBootTest带注释的测试类,它想利用测试实用程序:

package org.myproject.server;

// ...

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ServerITest {

    private @Autowired TestHelperBean helper;

    // ...
}

如果TestHelperBean与测试类在同一包中(或在子包中)定义,则此方法很好。

package org.myproject.server;

import org.springframework.stereotype.Component;

@Component
public class TestHelperBean {
    // ...
}

但是如果我将其移动到同级包中,则找不到该组件:

  

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为'org.myproject。 testutils .TestHelperBean'的合格bean:期望至少有1个有资格作为自动装配候选的bean。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

我猜默认情况下组件扫描仅在测试类的程序包和子程序包中查找-但是有没有办法覆盖此默认值?我试图在测试中添加@ComponentScan批注,但这似乎没有任何作用:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ComponentScan("org.myproject")
public class ServerITest {
    // ...
}

在Spring Boot测试中,有没有办法使用同级软件包中的bean?

4 个答案:

答案 0 :(得分:1)

如果将@ComponentScan注释放置在测试类上,则它不起作用。

可以改为:

  • 将嵌套类添加到测试中,并使用@Configuration@ComponentScan注释对该类进行注释。
  • 在测试类上使用@Import批注。请注意,@Import仅允许将单个类添加到上下文中。
  • 如果在其他情况下也不介意从同级包中添加类,则还可以将@ComponentScan批注放置在任何@Configuration类(或@Component,{{ 1}}等)。

答案 1 :(得分:0)

在组件扫描中,您可以添加需要扫描的多个软件包

@ComponentScan({"org.myproject","org.myproject. server","org.myproject. sibilings"})

答案 2 :(得分:0)

使用componentscan批注,您还可以指定“ *”以覆盖基本包下的所有子包。

@ComponentScan({"org.myproject.*", "org.newproj.*"})

它涵盖了“ org.myproject”和“ org.newproj”下的所有子包。

示例包装结构

org.myproject 
org.myproject.abc 
org.myproject.abcd 
org.myproject.xyz.abc

org.newproj 
org.newproj.abc 
org.newproj.xyz

OR

使用Configuration / SpringBootApplication类注册bean

@Bean
private TestHelperBean helper() {
    return new TestHelperBean();
}

答案 3 :(得分:0)

关于使用ComponentScan的其他答案是正确的。但是,the Spring Boot documentation强烈建议“您的主应用程序类应位于其他类之上的根包中”。从个人经验来看,我可以说偏离这种做法会导致更多的麻烦,而不是值得的。