Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestNG:确定下一个测试方法_Java_Testng_Entitymanager - Fatal编程技术网

Java TestNG:确定下一个测试方法

Java TestNG:确定下一个测试方法,java,testng,entitymanager,Java,Testng,Entitymanager,我的目标是在每个测试方法之后清除我的javax.persistence.EntityManager() 下面是一个测试类的示例: public class Example { @Test(dataProvider = "sampleDataProvider") public void testA(String parameter) { System.out.println(parameter); } @Test(dataProvider

我的目标是在每个测试方法之后清除我的javax.persistence.EntityManager()

下面是一个测试类的示例:

public class Example
{
    @Test(dataProvider = "sampleDataProvider")
    public void testA(String parameter)
    {
        System.out.println(parameter);
    }

    @Test(dataProvider = "sampleDataProvider")
    public void testB(String parameter)
    {
        System.out.println(parameter);
    }
}
entityManager在数据提供程序“sampleDataProvider”中使用,方法是查询数据库中的测试数据,然后按照以下格式编译:
新对象[2][1]
。请记住,数据的查询和编译都是在测试方法(用@DataProvider注释)实际运行之前完成的,我们实际上是在查询实体,而不仅仅是字符串

上述测试类的运行方式如下:

testA("some queried entity 1")
testA("some queried entity 2")
testB("some queried entity 1")
testB("some queried entity 2")
我最初的解决方案是使用
@postertest
注释来清除entityManager。但是,在第二次运行
testA
testB
之前,它将从entityManager中分离
“某些查询的实体2”
,这会导致对
“某些查询的实体2”
的成员进行读/写操作时出现问题

我的目标是在测试方法之后清除entityManager,而不是在测试方法的每个实例之后

TestNG是否有可能知道下一步运行哪个测试?这样,如果下一个测试是新的,我就可以轻松地清除entityManager


还有其他建议吗?

我不知道有什么简单的方法可以得到下一个测试方法。顺便说一句,您可以使用@AfterGroups注释获得相同的结果:

@Test(groups = {"groupA"})
public void testA(...) { ... }

@Test(groups = {"groupB"})
public void testB(...) { ... }

@AfterGroups(groups = {"groupA"})
public void afterGroupA() {
    // clear entity manager here
}
请注意,TestNG不保证测试启动的顺序,除非您使用@Test annotation的dependsOnMethods或dependsOnGroups参数或TestNG.xml文件中标记的“preserve order”属性显式指定它

更新


作为替代方案,您可以使用自己的。您可以实现方法,该方法将在必要时进行清除。AFAIU,调用的测试方法在部分填充的ITestResult中可用。顺便说一句,小心-这可能会导致隐式测试逻辑导致的问题(清除将无法从测试代码中看到)。

我不知道有什么简单的方法可以获得下一个测试方法。顺便说一句,您可以使用@AfterGroups注释获得相同的结果:

@Test(groups = {"groupA"})
public void testA(...) { ... }

@Test(groups = {"groupB"})
public void testB(...) { ... }

@AfterGroups(groups = {"groupA"})
public void afterGroupA() {
    // clear entity manager here
}
请注意,TestNG不保证测试启动的顺序,除非您使用@Test annotation的dependsOnMethods或dependsOnGroups参数或TestNG.xml文件中标记的“preserve order”属性显式指定它

更新


作为替代方案,您可以使用自己的。您可以实现方法,该方法将在必要时进行清除。AFAIU,调用的测试方法在部分填充的ITestResult中可用。顺便说一句,请小心-这可能会导致隐式测试逻辑导致的问题(从测试代码中看不到清除)。

谢谢。我已经想到了这个。然而,我们有大量的测试和数据提供者,必须对它们进行分组是一项非常困难的任务。我知道TestNG以随机顺序运行测试,但它必须有某种机制来“获取”下一个方法(随机)来运行它。我正在考虑覆盖它,只需在那里添加EM.clear()。然后您就可以实现TestListener-请参阅答案中的更新。谢谢!这是一个良好的开端。我将看看我能从这里走到哪里,以及可能出现的任何问题。或者,你可能想使用一种类似于本文中描述的技术:谢谢。我已经想到了这个。然而,我们有大量的测试和数据提供者,必须对它们进行分组是一项非常困难的任务。我知道TestNG以随机顺序运行测试,但它必须有某种机制来“获取”下一个方法(随机)来运行它。我正在考虑覆盖它,只需在那里添加EM.clear()。然后您就可以实现TestListener-请参阅答案中的更新。谢谢!这是一个良好的开端。我将看看我可以从这里走到哪里,以及可能出现的任何问题。或者,您可能希望使用类似于本文所述的技术: