如何在Spring测试监听器中获得TestNG ITestResult?

时间:2018-04-25 17:04:16

标签: java spring testing testng listeners

我正在使用Spring和TestNG编写测试。测试类的一个例子:

@SpringBootTest
@TestExecutionListeners(
        mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
        listeners = {TestListener.class}
)
public class BaseTest extends AbstractTestNGSpringContextTests
{
}

我的TestListener类扩展了TransactionalTestExecutionListener,因此我有beforeTestClass(TestContext testContext),afterTestMethod(TestContext testContext)等的覆盖方法。

我的问题是在afterTestMethod中我需要能够获得TestNG ITestResult或TestResult,这样我可以根据测试成功,失败或跳过等做不同的事情。有什么方法可以从春天访问ITestResult或TestResult测试听众?

1 个答案:

答案 0 :(得分:0)

没有简单直接的方法来访问已执行的测试方法的ITestResult对象,因为Spring似乎无法提供对它的访问。

您可以尝试这样做:

  • 构建一个实用程序方法,以便在给定代表刚执行的Method方法的@Test对象时,它将查询当前ITestContext并查找任何ITestResult} Method对象与提供的Method对象匹配的对象。
  • 让您的侦听器实现查询此实用程序方法以访问ITestResult对象。

以下是示例实现的样子:

public class MyListener extends TransactionalTestExecutionListener {
    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
      super.afterTestMethod(testContext);
      ITestResult currentTestResult = getCorrespondingResultFor(testContext.getTestMethod());
    }

    private ITestResult getCorrespondingResultFor(Method method) {
      ITestContext context = Reporter.getCurrentTestResult().getTestContext();
      Set<ITestResult> allResults = new HashSet<>();
      allResults.addAll(context.getPassedTests().getAllResults());
      allResults.addAll(context.getFailedTests().getAllResults());
      allResults.addAll(context.getSkippedTests().getAllResults());
      return allResults
          .stream()
          .filter(result -> result.getMethod().getConstructorOrMethod().getMethod().equals(method))
          .findAny()
          .orElse(null);
    }
}