以下注解只有在与 SpringRunnerSpring 的 JUnit 4 规则 或 Spring 的 JUnit 4 支持类 一起使用时才被支持:

  • @IfProfileValue
  • @ProfileValueSourceConfiguration
  • @Timed
  • @Repeat

    @IfProfileValue

@IfProfileValue 表示注解的测试在特定的测试环境中被启用。如果配置的 ProfileValueSource 为所提供的名称返回一个匹配的值,则测试被启用。否则,测试将被禁用,并且实际上是被忽略。

你可以在类级、方法级或两者中应用 @IfProfileValue。对于该类或其子类中的任何方法,@IfProfileValue的类级使用优先于方法级使用。具体来说,如果一个测试在类级和方法级都被启用,那么它就是被启用的。没有 @IfProfileValue意味着测试是隐式启用的。这类似于 JUnit 4 的 @Ignore注解的语义,除了 @Ignore的存在总是禁用一个测试。

下面的例子显示了一个有 @IfProfileValue注解的测试:

  1. // 只有当 value 是指定值得时候才运行该测试方法
  2. @IfProfileValue(name="java.vendor", value="Oracle Corporation")
  3. @Test
  4. public void testProcessWhichRunsOnlyOnOracleJvm() {
  5. // 一些只应在甲骨文公司的 Java VM 上运行的逻辑
  6. }

另外,你可以用一个值的列表来配置 @IfProfileValue(具有 OR 语义),以便在 JUnit 4 环境中实现类似 TestNG 的测试组支持。考虑一下下面的例子:

  1. @IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"})
  2. @Test
  3. public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
  4. // some logic that should run only for unit and integration test groups
  5. }

@ProfileValueSourceConfiguration

@ProfileValueSourceConfiguration 是一个类级别的注解,它指定了在检索通过 @IfProfileValue注解配置的配置文件值时要使用什么类型的 ProfileValueSource。如果没有为测试声明 @ProfileValueSourceConfiguration,则默认使用 SystemProfileValueSource。下面的例子显示了如何使用 @ProfileValueSourceConfiguration

  1. // 使用一个自定义的配置文件值源。
  2. @ProfileValueSourceConfiguration(CustomProfileValueSource.class)
  3. public class CustomProfileValueSourceTests {
  4. // class body...
  5. }

@Timed

@Timed 表示注解的测试方法必须在指定的时间段(以毫秒为单位)内完成执行。如果文本执行时间超过了指定的时间段,则测试失败。

这个时间段包括运行测试方法本身,任何测试的重复(见 @Repeat),以及任何测试夹具的设置或拆解。下面的例子显示了如何使用它:

  1. // 将测试的时间段设置为一秒。
  2. @Timed(millis = 1000)
  3. public void testProcessWithOneSecondTimeout() {
  4. // 一些运行时间不应超过 1 秒的逻辑
  5. }

Spring 的 @Timed注解与 JUnit 4 的 @Test(timeout=...)支持有着不同的语义。具体来说,由于 JUnit 4 处理测试执行超时的方式(即在一个单独的线程中执行测试方法),@Test(timeout=...)在测试时间过长的情况下会预先失败。另一方面,Spring 的 @Timed不会抢先让测试失败,而是等待测试完成后再失败。

@Repeat

@Repeat 表示注解的测试方法必须重复运行。测试方法运行的次数在注解中被指定。

重复执行的范围包括测试方法本身的执行,以及任何测试夹具的设置或拆除。当与 SpringMethodRule 一起使用时,该范围还包括 TestExecutionListener 实现对测试实例的准备。下面的例子展示了如何使用 @Repeat注解:

  1. @Repeat(10) // 重复这个测试十次。
  2. @Test
  3. public void testProcessRepeatedly() {
  4. // ...
  5. }