Java 如何初始化参数化类测试的设置?

Java 如何初始化参数化类测试的设置?,java,integration-testing,junit4,Java,Integration Testing,Junit4,我有两个实现相同接口的具体类。有两个测试是相同的,所以我想做一个参数化类测试。类最初只需要配置一次(使用相同的设置),因此这是我的解决方法: @RunWith(Parameterized.class) public class MyInterfaceTest { private MyInterface i; private static boolean setupDone[] = new boolean[2]; //this is ugly public MyInte

我有两个实现相同接口的具体类。有两个测试是相同的,所以我想做一个参数化类测试。类最初只需要配置一次(使用相同的设置),因此这是我的解决方法:

@RunWith(Parameterized.class)
public class MyInterfaceTest {

    private MyInterface i;
    private static boolean setupDone[] = new boolean[2]; //this is ugly

    public MyInterfaceTest(MyInterface i) {
        this.i = i;
        if(i instanceof ImplA && !setupDone[0]){
            setup();
            setupDone[0] = true;
        }else if(i instanceof ImplB && !setupDone[1]){
            setup();
            setupDone[1] = true;
        }
        //must add code here for more Impl -> ugly
    }


    @Parameterized.Parameters
    public static Collection<Object[]> getParameters()
    {
        return Arrays.asList(new Object[][] {
                { new ImplA() },
                { new ImplB() }
        });
    }

    //tets...

}
@RunWith(参数化的.class)
公共类MyInterfaceTest{
私有接口i;
私有静态布尔setupDone[]=new boolean[2];//这很难看
公共MyInterface测试(MyInterface i){
这个。i=i;
if(ImplA&!setupDone[0]的i实例){
设置();
setupDone[0]=真;
}else if(i ImplB&!setupDone的实例[1]){
设置();
setupDone[1]=真;
}
//必须在此处添加代码以获得更多简单->丑陋
}
@参数化。参数化
公共静态集合getParameters()
{
返回Arrays.asList(新对象[][]{
{new ImplA()},
{new ImplB()}
});
}
//春节。。。
}
这很难看。什么是更好的解决方案?

@RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class ServiceLocator1Test {

    private MyInterface i;

    public MyInterfaceTest(MyInterface i) {
        this.i = i;
    }


    @Parameterized.Parameters
    public static Collection<Object[]> getParameters()
    {
        MyInterface a = new ImplA(); setup(a);
        MyInterface b = new ImplB(); setup(b);

        return Arrays.asList(new Object[][] {
                { a },
                { b }
        });
    }

    //tets...

}

private static void setup(MyInterface myinterface){/*...*/}
公共类ServiceLocator1测试{ 私有接口i; 公共MyInterface测试(MyInterface i){ 这个。i=i; } @参数化。参数化 公共静态集合getParameters() { MyInterface a=新ImplA();设置(a); MyInterface b=new ImplB();设置(b); 返回Arrays.asList(新对象[][]{ {a}, {b} }); } //春节。。。 } 私有静态无效设置(MyInterface MyInterface){/*…*/}
对于getParameters方法,是否需要返回
对象
集合?您可以简单地将数组类型更改为
,以避免在构造函数中进行转换。我所做的转换是确定哪个Impl是
I
是,但由于它们都继承了
MyInterface
的方法,因此您可能不需要这样做。如果需要测试
MyInterface
具有的方法,则可以不使用强制转换调用
MyInterface
对象数组。只有在实现具有其他唯一方法名称并且您也需要测试这些名称时,才需要强制转换。否。我的目标是设置每个Impl一次。如果我重新设置,那就错了。必须只执行一次。对不起,也许我只是误解了每个实现的设置是如何完成的。