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
}
1 仅当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
}
1 仅当Java供应商为"Oracle Corporation"时才运行此测试。

或者,您可以配置@IfProfileValuevalues列表(具有OR语义),以在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
}
1 为单元测试和集成测试运行此测试。
@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
}
1 为单元测试和集成测试运行此测试。

@ProfileValueSourceConfiguration

@ProfileValueSourceConfiguration是一个类级别的注解,指定在通过@IfProfileValue注解配置的配置文件值时要使用何种类型的ProfileValueSource。如果未为测试声明@ProfileValueSourceConfiguration,则默认使用SystemProfileValueSource。以下示例显示了如何使用@ProfileValueSourceConfiguration

  • Java

  • Kotlin

@ProfileValueSourceConfiguration(CustomProfileValueSource.class) (1)
public class CustomProfileValueSourceTests {
	// class body...
}
1 使用自定义配置文件值源。
@ProfileValueSourceConfiguration(CustomProfileValueSource::class) (1)
class CustomProfileValueSourceTests {
	// class body...
}
1 使用自定义配置文件值源。

@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() {
	// ...
}
1 将此测试重复执行十次。
@Repeat(10) (1)
@Test
fun testProcessRepeatedly() {
	// ...
}
1 将此测试重复执行十次。