2013-08-30 21 views
10

Sto testando una classe con un costruttore complicato (con molti parametri). Il costruttore prende tre argomenti come:JMockit mock constructor

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

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

Il costruttore chiama quindi un super costruttore che diventa ancora più complesso. Usando JMockit, come posso creare un'istanza della classe e testare un metodo senza effettivamente richiamare i costruttori? Sono nuovo di JMockit, ogni aiuto sarà apprezzato.

Grazie!

risposta

12

Se ho capito bene, vuoi testare una classe con un costruttore mocked. Questo non è un buon approccio ai test perché non si sta testando il codice di produzione nella sua forma più pura.

Tuttavia, non tutto va secondo le regole, vero? :) Quindi se insisti, JMockIt ti permetterà di farlo. Puoi prendere in giro solo il costruttore e testare gli altri metodi. I costruttori di derisione sono ben documentati allo JMockIt project site.

Ecco una rapida dimostrazione si può provare da soli: il codice

Produzione:

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

Codice Mock: Codice

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

prova:

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

public class SomeTest { 

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

} 

Esecuzione del produzione il codice verrà stampato Production constructor called, ma eseguendolo sotto test verrà stampato Mock constructor called.

+0

Grazie per la risposta. Lo proverei. – userx

+0

'Se ho capito bene, vuoi testare una classe con un costruttore mocked. Questo non è un buon approccio ai test perché non stai testando il codice di produzione nella sua forma più pura. Non sono assolutamente d'accordo. Test unitario (test white box - che è quello per cui JMockit è usato) nella sua forma più pura è quello di testare le singole unità. Se si sta testando una particolare unità che non è un costruttore complesso, allora consentirne l'esecuzione è un test della scatola nera che è incredibilmente brutto da fare quando si tenta di eseguire il test dell'unità. – searchengine27

+0

ma come si impostano i campi dell'oggetto quando si prende in giro il costruttore (all'interno del metodo $ init())? – supertonsky