2012-04-10 19 views
6

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

@Stateless 
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote { 
    public String greet() { 
     return "hallo"; 
    } 
} 

दूरस्थ इंटरफ़ेस:

@Remote 
public interface TestServiceRemote { 
    public String greet(); 
} 

स्थान इंटरफ़ेस:

@Local 
public interface TestServiceLocal { 
    public String greet(); 
} 

और यह परीक्षण है:

@RunWith(Arquillian.class) 
public class GenericEntityDaoEjbIntegrationTest { 

    @Deployment 
    public static JavaArchive createTestArchive() 
        throws UnsupportedEncodingException { 
     return ShrinkWrap.create(JavaArchive.class, "test.jar") 
       .addClasses(
         TestServiceLocal.class, 
         TestServiceRemote.class, 
         TestServiceImpl.class); 
    } 

    @EJB 
    private TestServiceLocal testServiceLocal; 

    @EJB 
    private TestServiceRemote testServiceRemote; 

    //Will Fail 
    @Test 
    public void testTestServiceLocal() { 
     assertNotNull(this.testServiceLocal); 
    } 

    //Success  
    @Test 
    public void testTestServiceRemote() { 
     assertNotNull(this.testServiceRemote); 
    }  
} 

मैं उपयोग कर रहा हूँ Arquillian-glassfish एम्बेडेड 1.0.0.CR2, ग्लासफ़िश-एम्बेडडे डी-सब 3.1 और Arquillian-JUnit-कंटेनर 1.0.0.CR5 मेरी पोम के प्रासंगिक हिस्सा है:

<!-- arquillian test --> 
    <dependency> 
     <groupId>org.jboss.arquillian.junit</groupId> 
     <artifactId>arquillian-junit-container</artifactId> 
     <version>1.0.0.CR5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.arquillian.container</groupId> 
     <artifactId>arquillian-container-spi</artifactId> 
     <version>1.0.0.CR5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.arquillian.container</groupId> 
     <artifactId>arquillian-glassfish-embedded-3.1</artifactId> 
     <version>1.0.0.CR2</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.extras</groupId> 
     <artifactId>glassfish-embedded-all</artifactId> 
     <version>3.1</version> 
     <scope>test</scope> 
    </dependency> 

की इस फ़ाइल (यह किसी अपवाद शामिल नहीं है) के प्रासंगिक हिस्सा है:

10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome 
INFO: Portable JNDI names for EJB TestServiceImpl : [java:global/test/TestServiceImpl!de.test.service.TestServiceRemote, java:global/test/TestServiceImpl!de.test.service.TestServiceLocal] 
10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome 
INFO: Glassfish-specific (Non-portable) JNDI names for EJB TestServiceImpl : [de.test.service.TestServiceRemote, de.test.service.TestServiceRemote#de.test.service.TestServiceRemote] 
10.04.2012 15:38:16 com.sun.enterprise.web.WebApplication start 
INFO: WEB0671: Loading application [test] at [/test] 
10.04.2012 15:38:16 org.glassfish.deployment.admin.DeployCommand execute 
INFO: test was successfully deployed in 11.844 milliseconds. 

मेरी गलती क्या है? लोकेल इंटरफ़ेस के लिए इंजेक्शन प्राप्त करने के लिए मुझे क्या आवश्यकता है?

उत्तर

12

आप निम्न में से एक का उपयोग कर सकता:

  • तैनाती के लिए एक beans.xml फ़ाइल जोड़ें:

    return ShrinkWrap.create(JavaArchive.class, "test.jar") 
           .addClasses(
             TestServiceLocal.class, 
             TestServiceRemote.class, 
             TestServiceImpl.class) 
           .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    

    यह Arquillian की CDITestEnricher है, जो कहीं अधिक EJBTestEnricher से सक्षम है सक्षम बनाता है। यह @Inject एनोटेशन (स्पष्ट रूप से) को संभाल सकता है, लेकिन @Resource और @EJB एनोटेशन भी (सीडीआई स्पेक में संसाधन इंजेक्शन पर अनुभाग देखें) को संभाल सकता है। कंटेनर तब आपके टेस्ट क्लास इंस्टेंस में @EJB एनोटेटेड फ़ील्ड्स दोनों इंजेक्शन पॉइंट्स के रूप में व्यवहार करता है और निर्भरताओं को इंजेक्ट करता है।

  • तैनात बीन के पोर्टेबल जेएनडीआई नाम के साथ @EJB एनोटेशन के लिए mappedName संपत्ति निर्दिष्ट करें।

    @EJB(mappedName="java:global/test/TestServiceImpl!com.acme.TestServiceLocal") 
    private TestServiceLocal testServiceLocal; 
    

    आप यह सुनिश्चित करें कि पोर्टेबल JNDI नाम है कि अपने तैनाती के लिए उत्पन्न वैसा ही है जैसा की आवश्यकता होगी: आपके मामले में, यह कुछ ऐसी दिखाई देगी। मैंने केवल उस "को निर्दिष्ट किया है जो मेरे" com.acme.TestServiceLocal "इंटरफ़ेस के लिए जेनरेट किया गया था।

1

कोशिश TestServiceImpl-> TestServiceBean बदलने के लिए यह लग रहा है कि एम्बेडेड glassfish तुम भी आप का उपयोग सही @Deployment सेटिंग सही है यह सुनिश्चित करना चाहिए जवाब के अलावा सेम नाम

5

के लिए विशिष्ट आवश्यकताओं है। स्थानीय रूप से इंजेक्ट करने के लिए आपको यह सुनिश्चित करना होगा कि आपके पास @Deployment(testable=true) है (ध्यान दें कि यह डिफ़ॉल्ट है)।

Aquillian docs से

:

में कंटेनर मोड: @Deployment (परीक्षण योग्य = true)

हम ऊपर उल्लेख किया है, हम अपने @Deployment repackage करने के लिए की जरूरत है, कुछ Arquillian समर्थन वर्गों को जोड़ने , कंटेनर चलाने के लिए। यह हमें परीक्षण के साथ संवाद करने की क्षमता देता है, परीक्षण को समृद्ध करता है और दूरस्थ रूप से परीक्षण चलाता है। इस मोड में, परीक्षण दूरस्थ कंटेनर में निष्पादित करता है; Arquillian डिफ़ॉल्ट रूप से इस मोड का उपयोग करता है।

जब आप @ डिप्लॉयमेंट प्रदान करते हैं तो पैकेजिंग प्रक्रिया के अपेक्षित आउटपुट के अवलोकन के लिए पूर्ण प्रोटोकॉल संदर्भ देखें।

क्लाइंट मोड: @Deployment (परीक्षण योग्य = false)

अब इस विधा आसान हिस्सा है। इन-कंटेनर मोड के विपरीत जो परीक्षण निष्पादन को पुनर्निर्मित करता है और ओवरराइड करता है, उतना ही कम से कम क्लाइंट मोड करता है। यह आपकी @ डिप्लॉयमेंट को पुन: पैकेज नहीं करता है और न ही करता है, यह परीक्षण निष्पादन को दूरस्थ सर्वर पर अग्रेषित करता है। आपका परीक्षण केस आपके जेवीएम में अपेक्षित के रूप में चल रहा है और आप बाहर से कंटेनर का परीक्षण करने के लिए स्वतंत्र हैं, क्योंकि आपके ग्राहक इसे देखते हैं। एकमात्र चीज आर्किलियन आपकी @ डिप्लॉयमेंट के जीवन चक्र को नियंत्रित करने के लिए है।

यहां एक उदाहरण है जो सर्वलेट को क्लाइंट मोड के रूप में उपयोग कर रहा है।

यह ओपी (उनकी सही सेटिंग्स थी) में मदद नहीं करता है, लेकिन मुझे उम्मीद है कि यह Google से आने वाले लोगों की सहायता करता है, जैसा मैंने किया था।

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