2013-05-16 3 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 - а именно, что ваш одноточечно правильно проверяет, если экземпляр является недействительным и если это так, инициализирует его. В этом случае я предполагаю, что имя переменной для вашего экземпляра является «экземпляром». Далее, ваш ребенок классы будут выглядеть следующим образом:

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 содержит некоторые полезные рекомендации по использованию - убедитесь, что ваш синглтон соответствует этим критериям.

Смежные вопросы