使用@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的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2.x 实践记:@SpringBootTest
Spring Boot 2.x 实践记:@SpringBootTest