使用@SpringBootTest时如何在测试类中自动装配bean

Posted

技术标签:

【中文标题】使用@SpringBootTest时如何在测试类中自动装配bean【英文标题】:How to autowire beans in test class when using @SpringBootTest 【发布时间】:2019-05-17 15:29:55 【问题描述】:

我有一个带有 @SpringBootTest 注释的集成测试类,它启动完整的应用程序上下文并让我执行我的测试。但是我无法将 @Autowired bean 放入测试类本身。相反,我得到一个错误:

没有可用的“my.package.MyHelper”类型的合格 bean”。

如果我不 @Autowire 我的助手类,而是将代码直接保存在 setUp 函数中,则测试将按预期工作。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class)
public class CacheControlTest 

    @Autowired
    private MyHelper myHelper;

    @Before
    public void setUp() 
        myHelper.doSomeStuff();
    

    @Test
    public void test1() 
        // My test
    

如何在使用 @SpringBootTest 的同时在测试类中使用 Spring 自动装配?

按照下面的@user7294900 建议,创建一个单独的@Configuration 文件并将其添加到 CacheControlTest 的顶部:

@ContextConfiguration(classes =  CacheControlTestConfiguration.class )

但是,有什么方法可以将配置保存在 CacheControlTest 类本身中?我尝试在我的测试类中添加:

public class CacheControlTest 

    @TestConfiguration
    static class CacheControlTestConfiguration 
        @Bean
        public MyHelper myHelper() 
            return new MyHelper();
        
    


public class CacheControlTest 

    @Configuration
    static class CacheControlTestConfiguration 
        @Bean
        public MyHelper myHelper() 
            return new MyHelper();
        
    

但它们似乎没有任何作用。我仍然得到同样的错误。如上所述,当放置在单独的文件中时,相同的配置块仍然有效。

【问题讨论】:

你有MyHelper类型的bean吗?它是在哪里定义的? 该 bean 在 my.helpers 包中的测试类下定义。它在普通应用程序上下文中不可用 - 应该仅在测试上下文中可用 好了 - 你需要定义一个测试 @Configuration 并导入它。 我已经用我尝试过的@Configuration 块更新了这个问题。它们似乎没有效果 ***.com/a/50643036/2071828 【参考方案1】:

为您的测试类添加 ContextConfiguration:

@ContextConfiguration(classes =  CacheControlTestConfiguration.class )

【讨论】:

现代 Spring Boot 不应该需要这项工作 - 嵌套的配置类应该被自动拾取。 如果可能的话,我想将配置保留在测试类本身中。 实际上这是可行的。如果我将配置放在单独的文件中并将这一行添加到我的测试类中,我的测试将按预期工作。但是,有什么方法可以做到这一点,同时将配置保留在测试文件中?

以上是关于使用@SpringBootTest时如何在测试类中自动装配bean的主要内容,如果未能解决你的问题,请参考以下文章

调试器、@SpringBootTest 和 Gradle

一分钟上手SpringBootTest

Spring Boot 2.x 实践记:@SpringBootTest

Spring Boot 2.x 实践记:@SpringBootTest

Spring Boot 2.x 实践记:@SpringBootTest

SpringBootTest 和Testng组成测试套件