在我的春季启动应用程序中,我希望在我的所有测试中仅使用测试配置(特别是我的@Configuration
@EnableAuthorizationServer
类)覆盖我的@Configuration
个类之一。< / p>
在对spring boot testing features和spring integration testing features进行概述后,到目前为止还没有出现直接的解决方案:
@TestConfiguration
:这是为了扩展,而不是覆盖; @ContextConfiguration(classes=…)
和@SpringApplicationConfiguration(classes =…)
让我覆盖整个配置,而不仅仅是一个类; @Configuration
内的@Test
内部类覆盖默认配置,但不提供示例; 有什么建议吗?
答案 0 :(得分:48)
内部测试配置
测试的内部@Configuration示例:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {
@Configuration
static class ContextConfiguration {
@Bean
@Primary //may omit this if this is the only SomeBean defined/visible
public SomeBean someBean () {
return new SomeBean();
}
}
@Autowired
private SomeBean someBean;
@Test
public void testMethod() {
// test
}
}
可重复使用的测试配置
如果您希望将测试配置重用于多个测试,则可以使用Spring Profile @Profile("test")
定义独立的Configuration类。然后,让您的测试类使用@ActiveProfiles("test")
激活配置文件。请参阅完整代码:
@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {
@Autowired
private SomeBean someBean;
@Test
public void testMethod() {
// test
}
}
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
@Primary //may omit this if this is the only SomeBean defined/visible
public SomeBean someBean() {
return new SomeBean();
}
}
<强> @Primary 强>
bean定义的@Primary
注释是为了确保如果找到多个注释,那么这个注释将具有优先权。
答案 1 :(得分:9)
您应该使用spring boot profiles:
@Profile("test")
注释您的测试配置。@Profile("production")
注释您的生产配置。spring.profiles.active=production
。@Profile("test")
在测试类中设置测试配置文件。因此,当您的应用程序启动时,它将使用“生产”类,当测试星星时它将使用“测试”类。
如果使用内部/嵌套@Configuration
类,则将使用它而不是应用程序的主要配置。
答案 2 :(得分:1)
我最近不得不创建一个应用程序的dev版本,该版本应以dev
有效配置文件运行,并且没有任何命令行参数。我通过将这一类添加为新条目来解决它,该条目以编程方式设置了活动配置文件:
package ...;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;
@Import(OriginalApplication.class)
public class DevelopmentApplication {
public static void main(String[] args) {
SpringApplication application =
new SpringApplication(DevelopmentApplication.class);
ConfigurableEnvironment environment = new StandardEnvironment();
environment.setActiveProfiles("dev");
application.setEnvironment(environment);
application.run(args);
}
}
有关更多详细信息,请参见Spring Boot Profiles Example by Arvind Rai。