2013-08-30 14 views
10

Jestem jednostką testującą klasę, która ma skomplikowany konstruktor (z dużą ilością parametrów). Konstruktor pobiera trzy argumenty jak:JMockit mock constructor

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

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

Konstruktor wywołuje super konstruktora, który staje się jeszcze bardziej skomplikowane. Używając JMockit, jak mogę utworzyć instancję klasy i przetestować metodę bez faktycznego wywoływania konstruktorów? Jestem nowy w JMockit, każda pomoc zostanie doceniona.

Dzięki!

Odpowiedz

12

Jeśli dobrze cię zrozumiałem, chcesz przetestować klasę z wyśmiewanym konstruktorem. To nie jest dobre podejście do testowania, ponieważ nie testujesz kodu produkcyjnego w jego najczystszej postaci.

Jednak nie wszystko przebiega zgodnie z zasadami, prawda? :) Więc jeśli nalegasz, JMockIt pozwoli ci to zrobić. Możesz wyśmiewać samego konstruktora i testować inne metody. Szydercy konstruktorzy są dobrze udokumentowani na JMockIt project site.

Oto krótki pokaz można spróbować samemu: kod

produkcja:

// 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"); 
    } 
} 

kod Mock: Kod

// 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"); 
    } 
} 

Test:

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

public class SomeTest { 

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

} 

Uruchamianie produkcja kod wyświetli Production constructor called, ale uruchomienie go w ramach testu spowoduje wydrukowanie Mock constructor called.

+0

Dzięki za odpowiedź. Wypróbuję to. – userx

+0

'Jeśli dobrze cię zrozumiałem, chcesz przetestować klasę z wyśmiewanym konstruktorem. To nie jest dobre podejście do testowania, ponieważ nie testujesz kodu produkcyjnego w jego najczystszej formie. "Całkowicie się nie zgadzam. Testowanie jednostkowe (test White Box - do czego służy JMockit) w jego najczystszej formie polega na testowaniu poszczególnych jednostek. Jeśli testujesz konkretną jednostkę, która nie jest złożonym konstruktorem, wówczas zezwolenie jej na wykonanie jest testowaniem w czarnych skrzynkach, co jest niewiarygodne, gdy próbujesz przeprowadzić testowanie jednostkowe. – searchengine27

+0

ale jak ustawić pola obiektu podczas kpienia z konstruktora (w metodzie $ init())? – supertonsky