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 等)已包含在上下文中。