Java Spring Boot Test:如何从测试上下文中排除 java 配置类

2022-09-01 06:45:37

我有一个带有弹簧启动的Java Web应用程序

运行测试时,我需要排除一些Java配置文件:

测试配置(测试运行时需要包含):

@TestConfiguration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }

生产配置(测试运行时需要排除):

 @Configuration
 @PropertySource("classpath:otp.properties")
 public class OTPConfig { }

测试类(使用显式配置类):

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
public class AuthUserServiceTest { .... }

测试配置:

@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class, TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
public class TestAMCApplicationConfig extends AMCApplicationConfig { }

也有类:

@SpringBootApplication
public class AMCApplication { }

当测试正在运行时,使用,但我需要...OTPConfigTestOTPConfig

我该怎么做?


答案 1

通常,您将使用 Spring 配置文件来包含或排除 Spring Bean,具体取决于哪个配置文件处于活动状态。在您的情况下,您可以定义一个生产配置文件,默认情况下可以启用该配置文件。和测试配置文件。在生产配置类中,您将指定生产配置文件:

@Configuration
@PropertySource("classpath:otp.properties")
@Profile({ "production" })
public class OTPConfig {
}

测试配置类将指定测试配置文件:

@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class,    TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
@Profile({ "test" })
public class TestAMCApplicationConfig extends AMCApplicationConfig {
}

然后,在测试类中,您应该能够说出哪些配置文件处于活动状态:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
@ActiveProfiles({ "test" })
public class AuthUserServiceTest {
  ....
}

在生产环境中运行项目时,可以通过设置环境变量将“生产”作为默认活动配置文件:

JAVA_OPTS="-Dspring.profiles.active=production"

当然,您的生产启动脚本可能会使用除JAVA_OPTS之外的其他内容来设置Java环境变量,但不知何故,您应该设置 。spring.profiles.active


答案 2

您也可以使用如下方法:@ConditionalOnProperty

@ConditionalOnProperty(value="otpConfig", havingValue="production")
@Configuration
@PropertySource("classpath:otp.properties")
public class OTPConfig { }

和测试:

@ConditionalOnProperty(value="otpConfig", havingValue="test")
@Configuration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }

然后在您的main/resources/config/application.yml

otpConfig: production

并在您的test/resources/config/application.yml

otpConfig: test