自定义调用TestSuite的多个TestExecutionListeners方法的最佳方法是什么?

时间:2016-12-06 09:44:14

标签: java spring junit spring-test

为了优化目的,我需要自定义TestExecutionListeners调用逻辑

在我的情况下,我有一个ApplicationContext和两种类型的测试:

  1. 使用WebDriver(我们称之为ObservableTest
  2. 的人
  3. 使用RestTemplateJdbcTemplate的人(我们称之为ApiTest
  4. 每种类型都使用自己的TestExecutionListener

    1. ObservableTest - ObservableTestListener
    2. ApiTest - ApiTestListener
    3. ObservableTestListenerApiTestListenerTestListener延伸prepareTestInstance(),其中ObservableTestListener已定义

      beforeTestClass()实施afterTestClass()ApiTestListener方法以及JUnit TestSuite实现

      我需要在下一个方法中将上述测试类型合并到一个prepareTestInstance()中:

      1. 为每个测试调用ObservableTest
      2. 只要第一个beforeTestClass()即将被实例化,ObservableTestListener的{​​{1}}即被执行
      3. ApiTest
      4. 相同 在当前套件中完成最后afterTestClass()时,会调用ObservableTestListener的{​​li> ObservableTest
      5. ApiTest
      6. 相同

        事情变得更复杂,因为每个测试可以在一个套件中运行,并且在不同的ApplicationContexts中(由于不同的配置文件使用)

        我非常感谢正确实施这种逻辑的任何暗示和挖掘方向

        到目前为止,我有两个想法:

        1. 实施自定义Runner(我不相信它甚至可能)
        2. 以某种方式通知TestContextManager应该或不应该调用特定方法(beforeTestClass()afterTestClass())。我觉得 @BootstrapWith 自定义SpringClassRule可以帮助我
        3. 谢谢!

1 个答案:

答案 0 :(得分:1)

Spring TestContext Framework中的TestExecutionListener API在套件级别没有任何生命周期回调。

因此,开箱即用,没有办法指示Spring在套件之前或之后调用TEL上的方法。因此,您提出的任何支持您的要求的解决方案都必须完全自定义。

我没有预见到自定义SpringClassRule将如何有用:您仍然需要一些可靠的机制来确定测试套件的开始和结束时间。这实际上是最大的挑战,因为JUnit 4中的套件支持是通过特定的Runner实现的。因此,如果您通过JUnit 4 Suite运行所有测试,则可以在Suite的自定义子类中构建自己的生命周期回调。

此致

Sam(Spring TestContext Framework的作者)