Java 在TestNG中的所有class@Test方法之后,但在@AfterGroups之前运行代码

Java 在TestNG中的所有class@Test方法之后,但在@AfterGroups之前运行代码,java,testing,testng,Java,Testing,Testng,我想在我的应用程序中使用TestNG框架测试一些与数据库相关的类 为了简化,我添加了一个测试组“database”,并创建了一个测试类TestUtil,它包含两个方法:一个带有@BeforeGroups(groups=“database”)注释,它正在设置EntityManager和一些其他资源,另一个带有@AfterGroups(groups=“database”)标记,用于释放这些资源 我的大多数测试类在测试期间将一些实体持久化到数据库,我希望在调用该类的所有测试方法后清理数据库 如果我使用

我想在我的应用程序中使用TestNG框架测试一些与数据库相关的类

为了简化,我添加了一个测试组“database”,并创建了一个测试类TestUtil,它包含两个方法:一个带有@BeforeGroups(groups=“database”)注释,它正在设置EntityManager和一些其他资源,另一个带有@AfterGroups(groups=“database”)标记,用于释放这些资源

我的大多数测试类在测试期间将一些实体持久化到数据库,我希望在调用该类的所有测试方法后清理数据库

如果我使用@AfterClass注释,它将在@AfterGroups方法之后运行,这对我来说是不可接受的,因为清理方法仍然需要活动的EntityManager和其他与DB相关的资源

我可以用@Test(dependsOnMethods=“lastTestMethodInThisClass”)标记这些清理方法,但在这种情况下,每次向类添加新的测试方法时,我都需要编辑此注释


有没有其他更方便的方法来完成这项工作?

没有,没有这样的注释允许您在测试之后和之后运行代码。而不是
@Test(dependsOnMethods=“lastTestMethodInThisClass”)
您可以实现
org.testng.IMethodInterceptor
作为侦听器,并在
org.testng.IMethodInterceptor#intercept
中更改
@Test
顺序-基本上在列表中搜索您的“最后一个测试”——将处理/关闭资源的“最后一个测试”放在末尾并返回修改后的列表。因此,在添加新测试时,您不必更改
dependsOnMethods
,因为拦截器会为您执行此操作。

如果您希望在调用所有测试后运行清理方法,则可以使用
@AfterSuite
注释在清理方法中编写代码。这将在整个套件完成执行后执行