Spring 引导测试 - 没有可用类型 'com.example.MyService' 的合格 bean

Spring boot test - No qualifying bean of type 'com.example.MyService' available

Whosebug 上有很多类似的问题,但我发现 none 是我的情况。

在我使用 Spring boot 2.0.2.RELEASE 的集成测试中,我为测试创建了一个单独的 @Configuration class确实定义了 bean com.example.MyService。这个 bean 恰好被 com.example.OtherBean 中的某个其他 bean 使用。

代码如下:

测试class:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyIntegrationTestConfig.class},
        webEnvironment = SpringBootTest.WebEnvironment.MOCK)
public class MyService1Test extends MyAbstractServiceIntegrationTest {
@Test
    public void someTest() {}
}

设置和拆卸的通用摘要:

public class MyAbstractServiceIntegrationTest{
    @Before
    public void setUp(){}

    @After
    public void tearDown()
}

src/test 中的 MyIntegrationTestConfig,用于代替 src/main 中的配置:

@Configuration
@ComponentScan({"com.example"})
public class MyIntegrationTestConfig {
   @Bean
   public MyService myService() {
      return null;
   }
}

MyService 出于测试目的,bean 可以为 null。

当我运行测试时,我不断收到以下错误:

No qualifying bean of type 'com.example.MyService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

我什至尝试将这个内部 class 添加到 MyServic1Test。仍然没有帮助:

@TestConfiguration
static class MyServic1TestContextConfiguration {

    @Bean(name = "MyService")
    public MyService myService() {
        return null;
    }
}

知道我在这里做错了什么吗?还是我错过了什么?

我怀疑 Spring 在创建 src/test 文件夹中定义的 MyService bean 之前首先尝试 create/autowire src/main 文件夹中的 bean。难道是这样吗?或者是否存在 bean MyService 所在的不同上下文(如测试上下文),而其他 bean 位于其他上下文中并且无法找到 MyService。

附带问题:对于集成测试,使用webEnvironment = SpringBootTest.WebEnvironment.MOCK就可以了,对吗?

问题在于您如何初始化 bean。值 null 是导致问题的原因。就好像您实际上没有声明该对象的任何实例一样。要使其工作,请声明服务的有效实例 new MyService().