2013-08-30 2 views
10

Я тестирую модуль класса, который имеет сложный конструктор (с большим количеством параметров). Конструктор принимает три аргумента:JMockit mock constructor

public BehavioralDischargeCarePlan_Bus(Webform webForm,String dataEntryModel, String  obsBatId) { 

    super(webForm, dataEntryModel, obsBatId); 
..... 

Конструктор затем называет супер конструктор, который становится еще более сложным. Используя JMockit, как я могу создать экземпляр класса и протестировать метод без фактического вызова конструкторов? Я новичок в JMockit, любая помощь будет оценена по достоинству.

Спасибо!

ответ

12

Если вы правильно поняли, вы хотите протестировать класс с издеваемым конструктором. Это не очень хороший подход к тестированию, потому что вы не тестируете производственный код в его самой чистой форме.

Однако не все идет по правилам, не так ли? :) Итак, если вы настаиваете, JMockIt позволит вам это сделать. Вы можете высмеять только конструктор и проверить другие методы. Сверкающие конструкторы хорошо документированы на JMockIt project site.

Вот быстрая демонстрация вы можете попробовать себя: код

Продукции:

// src/main/java/pkg/SomeClass.java 
public class SomeClass { 
    public static void main(String[] args) { 
     new SomeClass("a", 2); 
    } 

    public SomeClass(String a, Integer b) { 
     System.out.println("Production constructor called"); 
    } 
} 

Пробный код:

// src/test/java/pkg/SomeMock.java 
import mockit.Mock; 
import mockit.MockUp; 

public class SomeMock extends MockUp<SomeClass> { 
    @Mock 
    public void $init(String a, Integer b) { 
     System.out.println("Mock constructor called"); 
    } 
} 

Код испытания:

// srce/test/java/pkg/SomeTest.java 
import org.junit.Test; 

public class SomeTest { 

    @Test 
    public void test() { 
     new SomeMock(); 
     new SomeClass("a", 2); 
    } 

} 

Запуск производство код будет печатать Production constructor called, но при запуске его теста будет напечатано Mock constructor called.

+0

Спасибо за ответ. Я бы попробовал. – userx

+0

'Если я правильно понял вас, вы хотите протестировать класс с издеваемым конструктором. Это не очень хороший подход к тестированию, потому что вы не тестируете производственный код в чистом виде. «Я полностью не согласен. Единичное тестирование (тестирование белого ящика - именно то, для чего используется JMockit) в самой чистой форме - это тестирование отдельных блоков. Если вы тестируете конкретный блок, который не является сложным конструктором, то его выполнение - это тестирование черного ящика, которое невероятно плохо, когда вы пытаетесь выполнить модульное тестирование. – searchengine27

+0

, но как вы устанавливаете поля объекта при издевательстве вашего конструктора (внутри метода $ init())? – supertonsky

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