我编写了一个长参数化测试,其中一个参数是使用双大括号语法的构造函数调用,以便为2d数组的每一行构造不同的对象:
Object[][] data = new Object[][] {
{ 1, 2, 3, new Blah() {{ setA(); }} }
{ 1, 2, 3, new Blah() {{ setB(); }} }
...
因为JUnit的原理是在每个@test上调用测试用例构造函数,所以我假设它对参数化测试也会这样做-但是我看到它只在每行调用该构造函数(为参数化测试定义的构造函数),而不是每行调用一次。
因此,测试字段是全局性的,并且测试相互影响。我想知道是否有办法强制运行程序为每个测试调用构造函数,就像普通的junit运行程序一样。谷歌和junit页面在这个案子上帮不了我。我真的不想重写整个测试,在这一点上,它是广泛和可读的。
最佳答案
我不确定我是否完全理解您的意思,但是当测试运行时,会发生以下情况:
用@parameters方法注释的方法只调用一次。
为注释方法返回的集合中的每一行创建一个测试运行器实例。
该测试使用其构造函数为参数集合中的每一行实例化,但它在初始调用缓存的相应参数值行中传递。
您可以通过单击here和here查看发生这种情况的位置。如果在调用之间改变状态(使用静态方法或其他方法),则会看到奇怪的事情。
编辑:在翻了一遍代码之后,我更明白你现在的要求。我刚刚使用JUnit4.10调试了一个参数化测试,它确实在每个测试中每行调用一次构造函数。