दिलचस्प पोस्ट
कोडिंग कन्वेंशन – एनमन नामकरण मॉड्यूलस ऑपरेटर कैसे काम करता है? मर्ज किए गए सभी गिट शाखाओं को मैं कैसे हटा सकता हूं? जीमेल आराम API: 400 बुरा अनुरोध + असफल प्रीकंडिशन एक UIImage का आकार बदलने का सबसे सरल तरीका है? मैं PowerShell में स्ट्रिंग और चर को कैसे जोड़ूं? होमब्रे: सिमलिंक नहीं किया जा सका, / usr / local / bin लेखन योग्य नहीं है Initializer सूची के साथ std :: array ऑब्जेक्ट का निर्माण कैसे करें? Icecast 2: प्रोटोकॉल विवरण, सी # का उपयोग कर स्ट्रीमिंग कैसे पाइप स्टेडरर, और नहीं stdout? MySQL बनाम उपयोग करना? सी ++ 11: सरणी का समय गणना संकलित करें नया टैब में खोलने के लिए लिंक बटन की संपत्ति? मैं ऑडियो डीबी स्तर की गणना कैसे कर सकता हूं? मैं AJAX के माध्यम से "और" (एम्परसेंड) वर्ण कैसे भेज सकता हूं?

जेयूनेट के साथ ईजेबी का परीक्षण करना

मुझे ईजेबी 3.1 का परीक्षण कैसे करना चाहिए, जो इंटर्नेटमेन्ट के लिए EntityManager का एक उदाहरण है?

संभव ईजेबी:

@Stateless @LocalBean public class CommentService { @PersistenceContext private EntityManager em; public List<Comment> findAll() { TypedQuery<Comment> query = em.createNamedQuery( Comment.FIND_ALL, Comment.class ); return query.getResultList(); } } 

संभव परीक्षण:

 @Test public void testFindAll() { List<Comment> all = service.findAll(); Assert.assertEquals(8, all.size()); } 

मैं केवल जावा ईई डेवलपर्स के लिए ग्लासफिश 3.1 और एक्लिप्स इंडिगो का उपयोग कर रहा हूं। मैंने पहले से ही इस तरह की कोशिश की:

 @Before public void setUp() throws Exception { ejbContainer = EJBContainer.createEJBContainer(); service = (CommentService) ejbContainer.getContext() .lookup("java:global/classes/CommentService"); } 

लेकिन मुझे मिला था:

 javax.ejb.EJBException: No EJBContainer provider available: no provider names had been found. 

Solutions Collecting From Web of "जेयूनेट के साथ ईजेबी का परीक्षण करना"

सबसे पहले, सुनिश्चित करें कि आप यूनिट परीक्षण और एकीकरण परीक्षणों के बीच भेद करते हैं। JUnit सिर्फ एक रूपरेखा है जो आपको परीक्षणों को व्यवस्थित और चलाने में मदद करता है, लेकिन आपको अपने परीक्षणों का दायरा निर्धारित करना होगा।

मुझे लगता है कि आप CommentService.findAll() एक यूनिट परीक्षण को परिभाषित करने में रुचि रखते हैं। इसका क्या मतलब है? इसका अर्थ है कि मैं FIND_ALL स्ट्रिंग निरंतर द्वारा नामित क्वेरी नाम पर बुलाव CommentService में findAll findAll() विधि परिणामों को कॉल करने की FIND_ALL करता FIND_ALL

निर्भरता इंजेक्शन और क्षीण करने के लिए धन्यवाद, आप आसानी से उस को प्राप्त कर सकते हैं जैसे Mockito को EntityManager बाहर निकालने के लिए। यूनिट टेस्ट के लिए, हम केवल findAll() में बिज़नेस लॉजिक पर ध्यान केंद्रित कर रहे हैं, इसलिए मैं टिप्पणी सेवा का परीक्षण देखने के लिए परेशान नहीं करेगा – यह findAll() कि टिप्पणी सेवा को देखा जा सकता है और एक उचित इकाई के लिए वायर्ड है प्रबंधक उदाहरण एक एकीकरण परीक्षण के दायरे में है, एक इकाई परीक्षण नहीं है

 public class MyCommentServiceUnitTest { CommentService commentService; EntityManager entityManager; @Before public void setUp() { commentService = new CommentService(); entityManager = mock(EntityManager.class); commentService.setEm(entityManager); // inject our stubbed entity manager } @Test public void testFindAll() { // stub the entity manager to return a meaningful result when somebody asks // for the FIND_ALL named query Query query = mock(Query.class); when(entityManager.createNamedQuery(Comment.FIND_ALL, Comment.class)).thenReturn(query); // stub the query returned above to return a meaningful result when somebody // asks for the result list List<Comment> dummyResult = new LinkedList<Comment>(); when(query.getResultList()).thenReturn(dummyResult); // let's call findAll() and see what it does List<Comment> result = commentService.findAll(); // did it request the named query? verify(entityManager).createNamedQuery(Comment.FIND_ALL, Comment.class); // did it ask for the result list of the named query? verify(query).getResultList(); // did it return the result list of the named query? assertSame(dummyResult, result); // success, it did all of the above! } } 

उपर्युक्त इकाई परीक्षण के साथ, मैंने findAll() कार्यान्वयन के व्यवहार का परीक्षण किया यूनिट टेस्ट ने पुष्टि की कि सही नामांकित क्वेरी प्राप्त की गई है और नाम क्वेरी के द्वारा दिया गया परिणाम कैली में वापस किया गया था।

क्या अधिक है, ऊपर दिए गए यूनिट परीक्षण findAll() कि findAll() का कार्यान्वयन स्वतंत्र रूप से अंतर्निहित JPA प्रदाता और अंतर्निहित डेटा से सही है मैं जेपीए और जेपीए प्रदाता का परीक्षण नहीं करना चाहता, जब तक कि मुझे संदेह नहीं है कि तीसरे पक्ष के कोड में बग हैं, तो इन निर्भरताओं को खत्म करने से मुझे टिप्पणी सेवा के व्यवसायिक तर्क पर पूरी तरह से परीक्षण करने की सुविधा मिलती है।

स्टब का उपयोग करते हुए परीक्षण व्यवहार की मानसिकता को समायोजित करने में थोड़ी देर लग सकती है, लेकिन यह आपके ईजेबी 3.1 बीन्स के व्यापारिक तर्क के परीक्षण के लिए एक बहुत ही शक्तिशाली तकनीक है क्योंकि यह आपको बाहरी निर्भरता को बाहर करने के लिए प्रत्येक परीक्षण के दायरे को अलग और संकीर्ण करने देता है ।

मैं इस प्रश्न के लिए स्वीकार किए गए उत्तर से असहमत हूं। उपरोक्त स्वीकार किए गए उत्तर दृढ़ता वाले स्तर सहित बहुत सारे कोड का मज़ाक उड़ाते हैं। वास्तविक बीन्स का परीक्षण करने के लिए आपको एक एम्बेडेड कंटेनर का उपयोग करना चाहिए, अन्यथा दृढ़ता परत का मजाकिया आपको एक परीक्षण के साथ छोड़ देता है जो कि परीक्षण से कुछ भी उपयोगी होता है

मूल पोस्टर की इस तरह एक सत्र बीन होना चाहिए जो इकाई प्रबंधक के साथ एक दृढ़ता इकाई के लिए इंगित करता है:

 @Stateless public class CommentService { @PersistenceContext(unitName = "pu") private EntityManager em; public void create(Comment t) { em.merge(t); } public Collection<Comment> getAll() { Query q = em.createNamedQuery("Comment.findAll"); Collection<Comment> entities = q.getResultList(); return entities; } } 

इकाई बीन इस तरह दिखता है:

 @Entity @NamedQueries({@NamedQuery(name = "Comment.findAll", query = "select e from Comment e")}) public class Comment implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } 

इस दृढ़ इकाई को persistence.xml फ़ाइल में परिभाषित किया गया है और इस तरह दिखता है:

 <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="pu" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>org.glassfish.embedded.tempconverter.Comment</class> <properties> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence> 

ध्यान दें कि लेनदेन का प्रकार JTA होना चाहिए।

आपको बस इतना करने की ज़रूरत है, इस तरह से एक परीक्षा लिखनी है, जो ईजेबी कंटेनर (ग्लासफिश एम्बेडेड कंटेनर) को बनाता है और नष्ट कर देती है:

 public class CommentTest extends TestCase { private Context ctx; private EJBContainer ejbContainer; @BeforeClass public void setUp() { ejbContainer = EJBContainer.createEJBContainer(); System.out.println("Opening the container" ); ctx = ejbContainer.getContext(); } @AfterClass public void tearDown() { ejbContainer.close(); System.out.println("Closing the container" ); } public void testApp() throws NamingException { CommentService converter = (CommentService) ctx.lookup("java:global/classes/CommentService"); assertNotNull(converter); Comment t = new Comment(); converter.create(t); t = new Comment(); converter.create(t); t = new Comment(); converter.create(t); t = new Comment(); converter.create(t); Collection<Comment> ts = converter.getAll(); assertEquals(4, ts.size()); } } 

आपको सिर्फ इन दो को अपनी निर्भरताओं में जोड़ना होगा यहां बताया गया है कि मेरी निर्भरता मेरे मावेन पीओएम में कैसे दिखती है:

 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> <type>jar</type> </dependency> <dependency> <groupId>org.glassfish.main.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>3.1.2</version> <scope>compile</scope> </dependency> 

अगर आपके पास निर्भरता , सत्र और इकाई की बीन, दृढ़ता फ़ाइल, परीक्षण फ़ाइल को ठीक तरह से लागू किया गया है जैसे कि यहां पर आपका परीक्षण पास होना चाहिए। यह मुझे यह पता लगाने के लिए एक पूरे दो दिन लगा था (इंटरनेट पर उदाहरणों में बुरे होते हैं)।

यूनिट टेस्ट लिखने और उन्हें एक असली कंटेनर में चलाने के लिए क्यों नहीं आर्क्वियन का उपयोग करना है?

कोई और mocks नहीं कोई और कंटेनर जीवन चक्र और तैनाती बाधाएं नहीं सिर्फ वास्तविक परीक्षण!

मोजे सामरिक हो सकते हैं, लेकिन अधिक बार नहीं, इसका उपयोग वास्तविक वातावरण के बाहर कोड काम करने के लिए किया जाता है। Arquillian चलो तुम mocks खाई और वास्तविक परीक्षण लिखने। ऐसा इसलिए है क्योंकि आर्क्वियन आपके परीक्षण को रनटाइम में लाता है, आपको कंटेनर संसाधनों तक पहुंच प्रदान करता है, अर्थपूर्ण फ़ीडबैक और कोड वास्तव में कैसे काम करता है इसके बारे में जानकारी देता है।

आर्क्वियन सुविधाओं के बारे में अधिक जानकारी

कंटेनर के खिलाफ चलने वाले यूनिट टेस्ट लिखना संभव है, लेकिन चेतावनी यह है कि कंटेनर / एसेसरवर होना चाहिए। चूंकि यह वास्तव में व्यावहारिक नहीं है, इसलिए सामान्य दृष्टिकोण एक "नकली" कंटेनर का उपयोग करने के लिए है ताकि आपकी इकाई परीक्षणों को चलाने के खिलाफ हो। इसके लिए, JUnitEE या ejb3unit देखें:

junitee

ejb3unit