2012-05-28 18 views
5

मेरे पास जुनीट के साथ कुछ परीक्षण सूट करने में जीवन चक्र समस्या है।जुनीट लाइफ-चक्र

आदेश काम जेपीए 2.0 इकाई लिखने के लिए में एक जावा डेवलपर रूप परीक्षण मैं चाहता हूँ:

  • सभी परीक्षणों सुइट्स से पहले एक बार एक EntityManagerFactory उदाहरण प्रमाणित करें। मैं @BeforeClass एनोटेशन का उपयोग कर
  • एक EntityManager उदाहरण इन्स्तांत और प्रत्येक परीक्षण मामले से पहले एक नया लेन-देन शुरू करने और पहले AOP की तरह शुरू कर दिया लेनदेन रोलबैक से वस्तु को प्राप्त/के बाद या सलाह के आसपास
  • बनाने में सक्षम होना किसी भी स्थापना की/किसी व्युत्पन्न परीक्षण सूट में पहले/बाद में ऑपरेशन को फाड़ें

मैं जुनीट परीक्षण बहुत लिख रहा हूं। लेकिन इस तरह के मामले में मुझे सूची से दूसरी और तीसरी वस्तुओं के साथ समस्या है।

कृपया निम्नलिखित टेस्ट स्वीट उदाहरण के एक बार देख ले:

एक सार टेस्ट सूट:

public abstract class AbstractPersistenceTest { 

    protected static EntityManagerFactory emf; 
    protected EntityManager em; 

    @BeforeClass 
    public static void setUpClass() { 
     emf = Persistence.createEntityManagerFactory("test"); 
    } 

    @Before 
    public void setUp() { 
     em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
    } 

    @After 
    public void tearDown() { 
     em.getTransaction().rollback(); 
     em.close(); 
    } 

    @AfterClass 
    public static void tearDownClass() { 
     emf.close(); 
    } 

} 

एक व्युत्पन्न टेस्ट स्वीट:

public class EmployeeJpqlTest extends AbstractPersistenceTest { 

    private Employee john; 
    private Employee jack; 

    @Before 
    public void setUp() { 
     john = new Employee("John Doe", 1000); 
     jack = new Employee("Jack Line", 1010); 

     em.persist(john); 
     em.persist(jack); 
    } 

    @Test 
    public void itShouldRetrieveAllEmplloyees() { 
     TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e", 
       Employee.class); 
     List<Employee> employees = query.getResultList(); 

     assertArrayEquals(new Employee[] { john, jack }, employees.toArray()); 
    } 

    @Test 
    public void itShoulRetrieveAllEmployeeNames() { 
     TypedQuery<String> query = em.createQuery(
       "SELECT e.name FROM Employee e", String.class); 
     List<String> names = query.getResultList(); 

     assertArrayEquals(new String[] { john.getName(), jack.getName() }, 
       names.toArray()); 
    } 

} 
क्योंकि अनिर्दिष्ट की

जुनीट लाइफ-साइकल एनोटेशन का ऑर्डर NullPointerException वें स्थान पर लेता है व्युत्पन्न वर्ग में e setUp() विधि। यह मेरे लिए स्पष्ट है।

क्या किसी भी व्युत्पन्न परीक्षण सूट कक्षा के प्रत्येक सेटअप()/tearDown() विधियों में प्रारंभ/रोलबैकिंग लेनदेन कोड इंजेक्शन के बिना लक्ष्य प्राप्त करना संभव है? या, हो सकता है, क्या कोई वैकल्पिक जुनीट माध्य या परीक्षण ढांचा है जो मेरी आवश्यकताओं को व्यक्त करने का एक आसान तरीका प्रदान कर सकता है?

अग्रिम धन्यवाद।

उत्तर

2

आप अपने परीक्षण विधियों में इकाई प्रबंधक और लेनदेन को इंजेक्ट करने के लिए Google Guice का उपयोग करने के विचार को कैसे पसंद करते हैं?

import com.google.inject.persist.Transactional; 
import javax.persistence.EntityManager; 

public class MyTest { 
     @Inject EntityManager em; 

     @Test 
     @Transactional 
     public void createNewPerson() { 
       em.persist(new Person(...)); 
     } 
} 

यह इस क्षेत्र में बहुत से प्रयास को सरल बना सकता है।

+0

हां, यह एक अच्छा विचार है। चूंकि Google गिइस एक दुबला आईओसी है, इसका उपयोग कोड के प्रभाव के बिना किया जा सकता है। –

1

setUp, super.setUpClass आदि में super.setUp() पर कॉल क्यों नहीं करते? आप वास्तव में क्या कर रहे हैं सबक्लास की विधि को ओवरराइड कर रहा है।

+0

वास्तव में मैं इस तरह से कर रहा था और नतीजतन अभिभावक 'setUp()' विधि को परीक्षण चलाने के दौरान लगातार दो बार बुलाया गया था - एक बार सीधे मेरे कोड से और दूसरी बार जुनीट जीवन चक्र के संबंध में जुनीट द्वारा। –

1

एक गैर स्थैतिक इकाई प्रबंधक और लेनदेन रोलबैक के एक-ऑफ तत्कालता को संभालने के लिए वसंत का उपयोग करने पर विचार करें। यहां तक ​​कि यदि आप अपने आवेदन में वसंत का उपयोग नहीं कर रहे हैं, तो आप इसे अपने परीक्षणों में इस्तेमाल करने से लाभ उठा सकते हैं। विवरण के लिए http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/testing.html की धारा 9.3 देखें।

+0

हां, मैं पूरी तरह से आपसे सहमत हूं। यह एक बहुत आसान विकल्प है। वह विशेष परियोजना इतनी छोटी और सरल है इसलिए मैं वसंत का उपयोग करने से बचता हूं, समझने के साथ कि मैं क्या मना करता हूं। धन्यवाद। –

संबंधित मुद्दे