《Spring 5官方文档》11集成测试 (三)

    xiaoxiao2023-12-30  151

    11.4.2 标准注解支持

    以下注解为Spring TestContext 框架所有的配置提供标准语义支持。注意这些注解不仅限于测试,可以用在Spring框架的任意地方。

    @Autowired@Qualifier@Resource(javax.annotation)如果JSR-250存在@ManagedBean(javax.annotation)如果JSR-250存在@Inject(javax.inject)如果JSR-330存在@Named(javax.inject)如果JSR-330存在@PersistenceContext(javax.persistence)如果JPA存在@PersistenceUnit(javax.persistence)如果JPA存在@Required@Transactional 在Spring TestContext 框架中,@PostConstruct 和 @PreDestroy 可以通过标准语义在配置于应用程序上下文的任意应用程序组件中使用; 但是, 这些生命周期注解在实际测试类中只有很有限的作用。如果一个测试类的方法被注解为@PostConstruct,这个方法将在test框架中的任何before方法(也就是被JUnit中的@Before注解方法)调用之前被执行, 这个规则将被应用于测试类的每个方法。另一方面,如果一个测试类的方法被注解为 @PreDestroy,这个方法将永远不会被执行。因为建议在测试类中使用test 框架的测试生命周期回调来代替使用@PostConstruct and @PreDestroy。

    11.4.3 Spring JUnit 4 测试注解

    @IfProfileValue指明该测试只在特定的测试环境中被启用。如果ProfileValueSource配置的name属性与此注解配置的name属性一致,这该测试将被启用。否则,该测试将被禁用并忽略。

    @IfProfileValue可以用在类级别、方法级别或者两个同时。使用类级别的@IfProfileValue注解优先于当前类或其子类的任意方法的使用方法级别的注解。有@IfProfileValue注解意味着则测试被隐式开启。这与JUnit4的@Ignore注解是相类似的,除了使用@Ignore注解是用于禁用测试的之外。

    1 @IfProfileValue(name="java.vendor", value="Oracle Corporation") 2@Test 3 public void testProcessWhichRunsOnlyOnOracleJvm() { 4// some logic that should run only on Java VMs from Oracle Corporation 5}

    或者,你可以 配置@IfProfileValue使用values列表(或语义)来实现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配置的profile值时指定使用什么样的ProfileValueSource类型。如果一个测试没有指定@ProfileValueSourceConfiguration,那么默认使用SystemProfileValueSource。

    1 @ProfileValueSourceConfiguration(CustomProfileValueSource.class) 2 public class CustomProfileValueSourceTests { 3// class body... 4}

    @Timed

    @Timed用于指明被注解的测试必须在指定的时限(毫秒)内结束。如果测试超过指定时限,就当作测试失败。

    时限包括测试方法本身所耗费的时间,包括任何重复(请查看@Repeat)及任意初始化和销毁所用的时间。

    1 @Timed(millis=1000) 2 public void testProcessWithOneSecondTimeout() { 3  // some logic that should not take longer than 1 second to execute 4}

    Spring的@Timed注解与JUnit 4的@Test(timeout=…​)支持相比具有不同的语义。确切地说,由于在JUnit 4中处理方法执行超时的方式(也就是,在独立纯程中执行该测试方法),如果一个测试方法执行时间太长,@Test(timeout=…​)将直接判定该测试失败。而Spring的@Timed则不直接判定失败而是等待测试完成。

    @Repeat

    @Repeat指明该测试方法需被重复执行。注解指定该测试方法被重复的次数。重复的范围包括该测试方法自身也包括相应的初始化和销毁方法。

    1 @Repeat(10) 2@Test 3 public void testProcessRepeatedly() { 4  // ... 5}

    11.4.4 Meta-Annotation Support for Testing

    可以将大部分测试相关的注解当作 meta-annotations使用,以创建自定义组合注解来减少测试集中的重复配置。

    下面的每个都可以在TestContext框架中被当作meta-annotations使用。

    @BootstrapWith@ContextConfiguration@ContextHierarchy@ActiveProfiles@TestPropertySource@DirtiesContext@WebAppConfiguration@TestExecutionListeners@Transactional@BeforeTransaction@AfterTransaction@Commit@Rollback@Sql@SqlConfig@SqlGroup@Repeat@Timed@IfProfileValue@ProfileValueSourceConfiguration

    例如,如果发现我们在基于JUnit 4的测试集中重复以下配置…

    01 @RunWith(SpringRunner.class) 02 @ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"}) 03 @ActiveProfiles("dev") 04@Transactional 05 public class OrderRepositoryTests { } 06  07 @RunWith(SpringRunner.class) 08 @ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"}) 09 @ActiveProfiles("dev") 10@Transactional 11 public class UserRepositoryTests { }

    我们可以通过一个自定义的组合注解来减少上述的重复量,将通用的测试配置集中起来,就像这样:

    1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"}) 4 @ActiveProfiles("dev") 5@Transactional 6 public @interface TransactionalDevTest { }

    然后我们就可以像下面一样使用我们自定义的@TransactionalDevTest注解来简化每个类的配置:

    查看源代码 打印 帮助 1 @RunWith(SpringRunner.class) 2@TransactionalDevTest 3 public class OrderRepositoryTests { } 4  5 @RunWith(SpringRunner.class) 6@TransactionalDevTest 7 public class UserRepositoryTests { }

    想获得详情,请查看Spring注解编程模型

    最新回复(0)