Spring JUnit 4 测试注解
从Spring Framework 7.0开始,JUnit 4的支持已被弃用,取而代之的是SpringExtension和JUnit Jupiter。
以下注释仅在与 SpringRunner、Spring 的 JUnit 4 规则 或 Spring 的 JUnit 4 支持类 一起使用时才被支持:
@IfProfileValue
@IfProfileValue 表示被注释的测试类或测试方法是为特定的测试环境启用的。如果配置的 ProfileValueSource 为提供的 name 返回一个匹配的 value,则该测试会被启用;否则,该测试将被禁用,实际上就是被忽略。
你可以在类级别、方法级别或两者同时应用@IfProfileValue。在类级别使用@IfProfileValue时,对于该类或其子类中的任何方法,类级别的设置会比方法级别的设置具有更高的优先级。具体来说,如果一个测试在类级别和方法级别都被启用,那么该测试就会被执行。如果没有@IfProfileValue注释,那么该测试默认就是启用的。这类似于JUnit 4中的@Ignore注解的语义,只不过@Ignore的存在总是会禁用相应的测试。
以下示例展示了一个带有@IfProfileValue注解的测试:
- Java
- Kotlin
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 1
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
// some logic that should run only on Java VMs from Oracle Corporation
}
仅当Java供应商为“Oracle Corporation”时运行此测试。
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 1
@Test
fun testProcessWhichRunsOnlyOnOracleJvm() {
// some logic that should run only on Java VMs from Oracle Corporation
}
仅当Java供应商为“Oracle Corporation”时运行此测试。
或者,你可以使用一组values(具有OR逻辑)来配置@IfProfileValue,从而在JUnit 4环境中实现类似TestNG的对测试组的支持。请参考以下示例:
- Java
- Kotlin
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) 1
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// some logic that should run only for unit and integration test groups
}
为单元测试和集成测试运行此测试。
@IfProfileValue(name="test-groups", values=["unit-tests", "integration-tests"]) 1
@Test
fun testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// some logic that should run only for unit and integration test groups
}
为单元测试和集成测试运行此测试。
@ProfileValueSourceConfiguration
@ProfileValueSourceConfiguration 是一种注释,可以应用于测试类,用于指定在通过 @IfProfileValue 注释配置配置文件值时使用哪种类型的 ProfileValueSource。如果一个测试没有声明 @ProfileValueSourceConfiguration,则默认会使用 SystemProfileValueSource。以下示例展示了如何使用 @ProfileValueSourceConfiguration:
- Java
- Kotlin
@ProfileValueSourceConfiguration(CustomProfileValueSource.class) 1
public class CustomProfileValueSourceTests {
// class body...
}
使用自定义的配置文件值源。
@ProfileValueSourceConfiguration(CustomProfileValueSource::class) 1
class CustomProfileValueSourceTests {
// class body...
}
使用自定义的配置文件值源。
@Timed
@Timed 表示带注释的测试方法必须在指定的时间范围内(以毫秒为单位)完成执行。如果测试方法的执行时间超过了这个指定的时间范围,那么测试就会失败。
这段时间包括运行测试方法本身、测试的任何重复执行(参见@Repeat),以及测试用例的任何设置或清除过程。以下示例展示了如何使用它:
- Java
- Kotlin
@Timed(millis = 1000) 1
public void testProcessWithOneSecondTimeout() {
// 一些运行时间不应超过1秒的逻辑
}
将测试的时间段设置为1秒。
@Timed(millis = 1000) 1
fun testProcessWithOneSecondTimeout() {
// 一些运行时间不应超过1秒的逻辑
}
将测试的时间段设置为1秒。
Spring的@Timed注解与JUnit 4中的@Test(timeout=…)支持在语义上有所不同。具体来说,由于JUnit 4处理测试执行超时的方式(即通过在一个独立的Thread中执行测试方法),如果测试花费的时间过长,@Test(timeout=…)会提前终止测试并导致失败。而Spring的@Timed则不会提前终止测试,而是会等待测试完成后再判断是否失败。
@Repeat
@Repeat 表示带此注解的测试方法必须被重复运行。测试方法要运行的次数在注解中指定。
需要重复执行的范围包括测试方法本身的执行,以及测试夹具的任何设置或清理操作。当与 SpringMethodRule 一起使用时,该范围还包含由 TestExecutionListener 实现进行的测试实例准备工作。以下示例展示了如何使用 @Repeat 注解:
- Java
- Kotlin
@Repeat(10) 1
@Test
public void testProcessRepeatedly() {
// ...
}
重复此测试十次。
@Repeat(10) 1
@Test
fun testProcessRepeatedly() {
// ...
}
重复此测试十次。