Java 如何在SpringBootTest中添加bean
这个问题看起来非常简单,但奇怪的是我没有找到解决办法 我的问题是关于在Java 如何在SpringBootTest中添加bean,java,spring,spring-boot,unit-testing,Java,Spring,Spring Boot,Unit Testing,这个问题看起来非常简单,但奇怪的是我没有找到解决办法 我的问题是关于在SpringBootTest中添加/声明bean,而不是重写bean,也不是使用mockito模拟bean 以下是我在尝试实现我真正需要的最简单实现时得到的结果(但它不起作用): 一些服务、bean和配置: @Value // lombok public class MyService { private String name; } 测试: @RunWith(SpringRunner.class) @Spri
SpringBootTest
中添加/声明bean,而不是重写bean,也不是使用mockito模拟bean
以下是我在尝试实现我真正需要的最简单实现时得到的结果(但它不起作用):
一些服务、bean和配置:
@Value // lombok
public class MyService {
private String name;
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SomeSpringConfig.class })
public class SomeSpringConfigTest {
private String testValue = "testServiceName";
// this bean is not used
@Bean
public MyService monitoringService(){ return new MyService(testValue); }
// thus this bean cannot be constructed using SomeSpringConfig
@Autowired
public MyClass myClass;
@Test
public void theTest(){
assert(myClass.getMonitoring().getName() == testValue);
}
}
现在,如果我将@Bean public-MyService-monitoring(){…}
替换为@MockBean-public-MyService-monitoring代码>,它可以工作。我觉得很奇怪,我可以轻松地模仿一个bean,但不能简单地提供它
=>那么我应该如何为一个测试添加自己的bean呢
编辑:
- 我认为(创建一个配置测试类)是一般的建议
- 但是,(使用@ContextConfiguration)更符合我的要求,即直接在测试类中添加@Bean
只需将配置添加为
@ContextHierarchy({
@ContextConfiguration(classes = SomeSpringConfig.class)
})
Spring测试需要知道您正在使用什么配置(以及在何处扫描加载的bean)。为了实现你的目标,你有更多的选择,最基本的是以下两个:
在包含bean的测试类之外创建配置类
@Configuration
public class TestConfig {
@Bean
public MyService monitoringService() {
return new MyService();
}
}
然后将其作为配置类@SpringBootTest(class={SomeSpringConfig.class,TestConfig.class})添加到测试中
或
若您只需要在这个特定的测试中使用这个配置,那个么您可以在静态内部类中定义它
public class SomeSpringConfigTest {
@Configuration
static class ContextConfiguration {
@Bean
public MyService monitoringService() {
return new MyService();
}
}
}
这将由spring boot test自动识别和加载您的测试类不是配置类,因此在其中放置@Bean
方法不会有任何作用。我尝试在测试类之前添加@configuration
,但它不起作用…只需创建新的配置类(不是在src中,而是在test文件夹中)类似于SomeSpringConfig
定义bean,然后将其包含在@springbootest(classes={SomeSpringConfig.class,AnotherConfig.class})
中。它确实有效(您可以给出答案)。但是,创建一个新的配置类似乎太难了,尤其是在添加模拟bean非常简单的情况下。我错了?@MockBean
是特别的,你为什么想要/需要一个@Configuration
类呢?它与你的代码一起工作,但使用测试类(SomeSpringConfigTest)。但是它可以简化为类定义之前的@ContextConfiguration(classes=SomeSpringConfigTest.class)
。I.no@ContextHierarchy.也许你应该添加一点关于这些装饰是怎么做的解释,从而说明它是如何满足我的要求的?
@Configuration
public class TestConfig {
@Bean
public MyService monitoringService() {
return new MyService();
}
}
public class SomeSpringConfigTest {
@Configuration
static class ContextConfiguration {
@Bean
public MyService monitoringService() {
return new MyService();
}
}
}