使用不同的数据运行JUnit测试

时间:2013-05-16 01:21:52

标签: java testing junit

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

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 个答案:

答案 0 :(得分: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 :(得分: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会查看一些有用的指南 - 确保您的单身符合此标准。