我有一个spring-boot
应用程序,我正在编写IT测试。
当我激活application-dev.properties
个人资料
dev
以下是我的测试内容:
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class ApplicationTests {
@Autowired
Environment env;
@Test
public void contextLoads() {
System.out.println(Arrays.toString((env.getActiveProfiles())));
}
}
ServiceITTest
public class ServiceITTest extends ApplicationTests {
@value
String username;
@value
String address;
@Autowired
MyService myService;
@Test
public void check_for_valid_username_address(){
myService.validate(username,address);
}
}
我希望上面的测试仅在我设置" dev"," qa"的配置文件时运行。默认情况下,它不应该运行。
是否有可能在弹簧启动测试中获得精细控制?
答案 0 :(得分:7)
您可能希望使用<ul>
<li>
<span>something</span>
<div></div>
</li>
<li>
<span>something</span>
<div>something else</div>
</li>
</ul>
注释。不幸的是,它不能直接在活动配置文件上工作,但它可以读取属性,因此如果您只在配置文件中定义要运行测试的特定属性,则可以在该特定属性上使用该注释。
答案 1 :(得分:3)
在Spring中,您还可以使用@DisabledIf
批注。它允许指定一个Spring Expression Language表达式。有关示例,请参见this blog post。
JUnit 5还具有:
@DisabledIfEnvironmentVariable
@DisabledIfSystemProperty
答案 2 :(得分:1)
它也与活动配置文件一起使用-有一个包含活动配置文件的属性值:
仅对具有特定配置文件的活动进行测试:
@IfProfileValue(name = "spring.profiles.active", values = {"specific"})
由于如果特定配置文件处于活动状态,因此我的测试不应该运行,所以我将其添加到了这些测试中:
@ActiveProfiles(profiles = {"default"})
它不适用于@IfProfileValue
和“默认”,并且如果未启用特定配置文件,我也没有发现任何“运行”。
答案 3 :(得分:0)
我想排除需要外部服务的测试,但无法按照我想要的方式(或多或少不存在version: '3'
network:
mynet:
external: false
services:
database:
image: mariadb
network:
- mynet
application:
build: .
network:
- mynet
environment:
DATABASE_URL: "mysql://username:password@my-database-url:3306"
)进行测试。
作为替代方案,我使用了JUnit Assume.assumeThat来提供我想要的行为。例如,
@IfNotProfileValue
我最终没有使用配置文件来驱动它,但是您应该能够定义属性或使用环境来确定配置文件是否处于活动状态。
Assume.assumeThat("Skipping Test: No username property", this.username, not(isEmptyString()));
可以在assumeThat
和@Test
方法中使用,但是请注意@Before
方法仍将运行,因此清理可能需要代码保护。
答案 4 :(得分:0)
您可以使用org.springframework.core.env.Environment
获取活动配置文件:
(请注意,是科特林。)
@Autowired
private val environment: Environment? = null
private fun isProfileActive(name: String) = environment!!.activeProfiles.contains(name)
@Test fun onlyOnOpenShift {
org.junit.Assume.assumeTrue(isProfileActive("openshift"));
...
}
如果您在很多情况下会使用它(我建议这可能暗示您做错了事),那么用@OnlyIfProfileActive("openshift")
这样的注释来修饰测试方法可能会有所收获。并使用您自己的JUnit扩展对其进行处理,例如实现org.junit.jupiter.api.extension.BeforeTestExecutionCallback
并确定该方法是否应运行。在这种情况下,可以从Spring测试运行器获得环境。
@Test @OnlyIfProfileActive("openshift")
fun onlyOnOpenShift {
...
}
我怀疑,@IfProfileValue
这样的注释是做什么的。但是在这里您将拥有更多控制权。
例如,要使其具有通用性,它可以是用JEXL或JUEL等评估的表达式。
@Test @SpringProfilesCondition("openshift && !mockDatabase")
fun onlyOnOpenShift {
...
}
答案 5 :(得分:0)
我最近不得不这样做。
import org.springframework.core.env.Environment;
import static org.junit.Assume.assumeFalse;
@Test
public void testSomethingWhenProfileIsNot(){
assumeFalse("Ignore this test when the active profile is 'myprofile'",
Arrays.stream(environment.getActiveProfiles()).anyMatch( profileName -> "myprofile".equals(profileName)));
}
@Test
@IfProfileValue(name = "spring.profiles.active", value = "myprofile")
public void testSomethingWhenProfileIs(){
}