2013-05-16 24 views
0

我有一套单元测试。我有一个静态变量,它在setup()方法中被初始化。我想用这个静态变量的两个不同值来运行我所有的单元测试套件。使用不同的数据运行JUnit测试

setup()中的静态变量被初始化为一个单例对象。所以,我不能(我想我不能)使用JUnit参数化测试。

我必须使用该静态变量的一个值运行所有测试,然后使用其他静态变量值运行所有测试。

任何有关如何尽可能以优雅的方式做到这一点的想法。下面

代码,如果我上面的介绍是不是很容易理解

public class MyClassTest{ 
     private static final Dep_class dep_obj; 

     public static void setup(){ 
       dep_obj = Dep_class.getInstance("VALUE_1"); 
       //You can have only instance of Dep_class at any time. 
       //So for second run I need to do a 
       //dep_obj = Dep_class.getInstance("VALUE_2") and run my tests. 
     } 

     public void test_mymethod(){ 
      //do something with dep_obj 
     } 

回答

2

试试这个

@RunWith(Parameterized.class) 
public class MyClassTest { 
    private Object dep_obj; 

    public MyClassTest(String val) { 
     dep_obj = val; 
    } 

    @Parameters 
    public static Collection<?> data() { 
     Object[][] data = { { "val1" }, { "val2" }, { "val3" } }; 
     return Arrays.asList(data); 
    } 

    @Test 
    public void test() { 
     System.out.println(dep_obj); 
    } 
} 
1

所以首先,我会质疑你为什么是这样初始化的单例。看起来好像为你的.getInstance(String s)方法添加一个参数会增加模糊性和意外的行为,因为这个String参数在实例化之后将被忽略(除非你在类型改变时重新实例化它,在这种情况下,它将是高度不可预测的在运行时)。

在任何情况下,一个简单的方法就是将test_mymethod()抽象为父类,并有两个子测试类,每个类都实例化一个不同的单例实例。由于您的JVM不会重新启动,因此在运行任何测试之前,您还需要像PowerMock一样将单例重置为预加载状态。

所以父类看起来像这样(加JUnit标注):

public abstract class MyAbstractTestClass { 
     private final Dep_class dep_obj; 

     @Before 
     public abstract void setup(){ 
      // Begin by ensuring that the singleton instance is initialized to null - 
      // this is highly important, since subclasses will not be able to rely on 
      // an un-initialized state 
      Whitebox.setInternalState(dep_obj.getInstance(/*default, arbitrary, or null value*/, "instance", null); 

      // Now leave the actual singleton initialization to child classes 
      dep_obj = getSingleton(); 
     } 

     public abstract Dep_class getSingleton(); 

     @Test 
     public void test_mymethod(){ 
      //do something with dep_obj 
     } 
} 

我与Powermock几个假设 - 即你的单身正确检查,看是否该实例为null,如果是的话,初始化它。在这种情况下,我假设你的实例的变量名是“instance”。接下来,你的子类应该是这样的:

public class MyTestClass1 extends MyAbstractTestClass { 

     @Override 
     public void Dep_class getSingleton() { 
       return Dep_class.getInstance("VALUE_1"); 
     } 
} 

public class MyTestClass2 extends MyAbstractTestClass { 

     @Override 
     public void Dep_class getSingleton() { 
       return Dep_class.getInstance("VALUE_2"); 
     } 
} 

同样,我会强烈建议您重新思考实现这样一个单身。单身应该很少使用 - 在可疑的设计模式之上的这种实现是眉毛提升者。 This question会使用一些很好的使用指南 - 确保你的单身人士符合这个标准。

相关问题