Spring 启动测试未从兄弟包中找到 bean
Spring Boot test doesn't find bean from sibling package
我有一个 @SpringBootTest
注释测试 class 想要使用测试实用程序:
package org.myproject.server;
// ...
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ServerITest {
private @Autowired TestHelperBean helper;
// ...
}
如果 TestHelperBean
在与测试 class 相同的包中定义(或在子包中),则此方法工作正常。
package org.myproject.server;
import org.springframework.stereotype.Component;
@Component
public class TestHelperBean {
// ...
}
如果我将其移至同级包,则找不到该组件:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.myproject.testutils.TestHelperBean' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我想默认情况下组件扫描只在测试 class' 包和子包中查找——但是有没有办法覆盖这个默认值?我试图将 @ComponentScan
注释添加到我的测试中,但这似乎没有任何效果:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ComponentScan("org.myproject")
public class ServerITest {
// ...
}
有没有办法在 Spring 启动测试中使用兄弟包中的 bean?
组件扫描中可以添加多个需要扫描的包
@ComponentScan({"org.myproject","org.myproject. server","org.myproject. sibilings"})
使用 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
或
用 Configuration/SpringBootApplication class
注册 bean
@Bean
private TestHelperBean helper() {
return new TestHelperBean();
}
关于 ComponentScan
的使用的其他答案是正确的。但是,the Spring Boot documentation强烈建议"your main application class be in a root package above other classes"。根据个人经验,我可以说偏离这种做法会导致更多的麻烦。
@ComponentScan
注释 不起作用 如果放置 测试 class.
也可以这样做:
- 将嵌套的 class 添加到您的测试中,并使用
@Configuration
和 @ComponentScan
注释对 class 进行注释。
- 在测试 class 上使用
@Import
注释。请注意,@Import
仅允许将单个 class 添加到上下文中。
- 如果不介意在其他情况下也从兄弟包中添加 classes,您还可以将
@ComponentScan
注释放在任何 @Configuration
class(或 @Component
、@Service
等)已包含在上下文中。
我有一个 @SpringBootTest
注释测试 class 想要使用测试实用程序:
package org.myproject.server;
// ...
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ServerITest {
private @Autowired TestHelperBean helper;
// ...
}
如果 TestHelperBean
在与测试 class 相同的包中定义(或在子包中),则此方法工作正常。
package org.myproject.server;
import org.springframework.stereotype.Component;
@Component
public class TestHelperBean {
// ...
}
如果我将其移至同级包,则找不到该组件:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.myproject.testutils.TestHelperBean' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我想默认情况下组件扫描只在测试 class' 包和子包中查找——但是有没有办法覆盖这个默认值?我试图将 @ComponentScan
注释添加到我的测试中,但这似乎没有任何效果:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ComponentScan("org.myproject")
public class ServerITest {
// ...
}
有没有办法在 Spring 启动测试中使用兄弟包中的 bean?
组件扫描中可以添加多个需要扫描的包
@ComponentScan({"org.myproject","org.myproject. server","org.myproject. sibilings"})
使用 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
或
用 Configuration/SpringBootApplication class
注册 bean@Bean
private TestHelperBean helper() {
return new TestHelperBean();
}
关于 ComponentScan
的使用的其他答案是正确的。但是,the Spring Boot documentation强烈建议"your main application class be in a root package above other classes"。根据个人经验,我可以说偏离这种做法会导致更多的麻烦。
@ComponentScan
注释 不起作用 如果放置 测试 class.
也可以这样做:
- 将嵌套的 class 添加到您的测试中,并使用
@Configuration
和@ComponentScan
注释对 class 进行注释。 - 在测试 class 上使用
@Import
注释。请注意,@Import
仅允许将单个 class 添加到上下文中。 - 如果不介意在其他情况下也从兄弟包中添加 classes,您还可以将
@ComponentScan
注释放在任何@Configuration
class(或@Component
、@Service
等)已包含在上下文中。