如何在 Spring 测试监听器中获取 TestNG ITestResult?
How can I get TestNG ITestResult in Spring test listener?
我正在使用 Spring 和 TestNG 编写测试。测试示例 class:
@SpringBootTest
@TestExecutionListeners(
mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
listeners = {TestListener.class}
)
public class BaseTest extends AbstractTestNGSpringContextTests
{
}
我的 TestListener class 扩展了 TransactionalTestExecutionListener 所以我有 beforeTestClass(TestContext testContext)、afterTestMethod(TestContext testContext) 等的覆盖方法
我的问题是,在 afterTestMethod 中,我需要能够获得 TestNG ITestResult 或 TestResult,这样我就可以根据测试成功、失败或跳过等做不同的事情。有什么方法可以让我访问 ITestResult 或 TestResult spring 测试监听器?
没有简单直接的方法来访问已执行的测试方法的 ITestResult
对象,因为 Spring 似乎不提供对它的访问。
您可以尝试这样做:
- 构建一个实用方法,这样当给定一个表示刚刚执行的
@Test
方法的 Method
对象时,它将查询当前 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);
}
}
我正在使用 Spring 和 TestNG 编写测试。测试示例 class:
@SpringBootTest
@TestExecutionListeners(
mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
listeners = {TestListener.class}
)
public class BaseTest extends AbstractTestNGSpringContextTests
{
}
我的 TestListener class 扩展了 TransactionalTestExecutionListener 所以我有 beforeTestClass(TestContext testContext)、afterTestMethod(TestContext testContext) 等的覆盖方法
我的问题是,在 afterTestMethod 中,我需要能够获得 TestNG ITestResult 或 TestResult,这样我就可以根据测试成功、失败或跳过等做不同的事情。有什么方法可以让我访问 ITestResult 或 TestResult spring 测试监听器?
没有简单直接的方法来访问已执行的测试方法的 ITestResult
对象,因为 Spring 似乎不提供对它的访问。
您可以尝试这样做:
- 构建一个实用方法,这样当给定一个表示刚刚执行的
@Test
方法的Method
对象时,它将查询当前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);
}
}