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

watbbzwu  于 2022-10-30  发布在  Java
关注(0)|答案(7)|浏览(250)

我有一个带有Sping Boot 的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 { }

当测试运行时使用OTPConfig,但我需要TestOTPConfig ...
"我该怎么做"

z2acfund

z2acfund1#

通常您会使用Spring配置文件来包括或排除Springbean,这取决于哪个配置文件是活动的。和测试配置文件。在生产配置类中,您可以指定生产配置文件:

@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 {
  ....
}

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

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

当然,您的生产启动脚本可能会使用JAVA_OPTS之外的其他东西来设置Java环境变量,但您应该设置spring.profiles.active

x6492ojm

x6492ojm2#

您也可以像下面这样使用@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
xj3cbfub

xj3cbfub3#

您也可以只模拟不需要的配置。例如:

@MockBean
private AnyConfiguration conf;

把它放到你的测试类中,这样可以避免真实的的AnyConfiguration被加载。

c86crjj0

c86crjj04#

此外,对于排除自动配置:

@EnableAutoConfiguration(exclude=CassandraDataAutoConfiguration.class)
public class // ...
63lcw9qa

63lcw9qa5#

测试文件夹中创建同一类作为“无用”镜像,例如:
中,您有**/应用程序/MyConfig.java**
使用 MyConfig.java**@Configuration测试文件夹中创建/app/ www.example.com**,并在其中保留空正文

67up9zun

67up9zun6#

我用的最简单的方法是-
1.把@ConditionalOnProperty放到我的主源代码中。
1.然后定义一个测试Bean并将其添加为测试配置的一部分。可以在主测试类中导入该配置,也可以通过其他方式导入。只有在需要注册测试Bean时才需要进行此操作。如果不需要该Bean,请转至下一步。
1.在www.example.com中application.properties的src/test/resources下添加一个属性,以禁用主文件夹中存在的配置类。
瞧!

oyjwcjzk

oyjwcjzk7#

您可以在Configuration类中使用@ConditionalOnMissingClass("org.springframework.test.context.junit4.SpringJUnit4ClassRunner")SpringJUnit4ClassRunner可以被仅存在于测试环境中的任何类替换。

相关问题