我有一个@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?
答案 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强烈建议“您的主应用程序类应位于其他类之上的根包中”。从个人经验来看,我可以说偏离这种做法会导致更多的麻烦,而不是值得的。