2017-01-09 11 views
7

पर आर्किलीयन हमारे एकीकरण परीक्षणों के लिए मैं आर्किलियन का उपयोग करना चाहता था और 'tutorial प्रारंभ करना' में सभी चरणों का पालन करना चाहता था। चूंकि मेरे पास एक मौजूदा एप्लिकेशन चीजें सेट अप करने के लिए इतनी छोटी नहीं हैं, हालांकि मैं ज्यादातर समस्याओं को ठीक करने में कामयाब रहा हूं। अब मुझे एक एनपीई अपवाद मिलता है जो इंगित करता है कि सीडीआई काम नहीं कर रहा है। WAS 8.5 remote container दस्तावेज़ीकरण के अनुसार मुझे एहसास हुआ कि @PersistenceContext समर्थित नहीं है। तब से यह दुर्भाग्यपूर्ण है कि शायद मैं आर्किलियन का उपयोग नहीं कर सकता या क्या कोई अन्य संभावना है?WAS रिमोट कंटेनर और @PersistenceContext

सरलीकृत कोड संरचना:

class MyTest{ 

    @Deployment 
    public static EnterpriseArchive createDeployment() { 
    ... 
    } 

    @Inject 
    public Service2Inject service; 

    @Test 
    public void testService() { 
    //Assert.assertNotNull("Dependency injection failed!",service); 
    String s = service.getSomeString("10"); 
    ... 
    } 
} 


public class Service2Inject implements SomeInterface { 

    @Inject 
    private SomeOtherService serviceOther; 

    @Override 
    public String getSomeString(String id) { 
    String testString = serviceOther.getSomeOtherStrings(); 
    ... 
    } 
} 

public class SomeOtherService implements SomeInterface2 { 

    @Inject 
    private EntityManager entityManager; 

    @Override 
    public List<String> getSomeOtherStrings(String Id) { 
    Query query = entityManager.createNamedQuery(...) 
    ... 
    } 
} 

public class EntityManagerProducer { 
    @PersistenceContext(unitName="datasourcename") 
    @Produces 
    private EntityManager entityManager; 
} 

तो वहाँ Arquillian और था दूरदराज के कंटेनर के साथ अपने आवेदन का परीक्षण करने के एक संभावना है?

अद्यतन:

java.lang.NullPointerException 
    at MyTest.testService(MyTest.java:84) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.jboss.arquillian.junit.Arquillian$8$1.invoke(Arquillian.java:379) 
    at org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter.execute(LocalTestExecuter.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:145) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:116) 
    at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67) 
    at org.jboss.arquillian.container.test.impl.client.protocol.local.LocalContainerMethodExecutor.invoke(LocalContainerMethodExecutor.java:50) 
    at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:109) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:145) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:116) 
    at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67) 
    at org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:142) 
    at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createTestContext(ContainerEventController.java:129) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:130) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:92) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:73) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:145) 
    at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:136) 
    at org.jboss.arquillian.junit.Arquillian$8.evaluate(Arquillian.java:372) 
    at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:246) 
    at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:431) 
    at org.jboss.arquillian.junit.Arquillian.access$200(Arquillian.java:55) 
    at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:260) 
    at org.jboss.arquillian.junit.Arquillian$7.evaluate(Arquillian.java:330) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:205) 
    at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:431) 
    at org.jboss.arquillian.junit.Arquillian.access$200(Arquillian.java:55) 
    at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:219) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:167) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

अद्यतन:: यहाँ स्टैकट्रेस है

जब से मैं एक आसान JarArchive साथ परीक्षण नहीं कर सकते मैं इस तरह एक shrinkwrap उद्यम बनाने के लिए निम्नलिखित का उपयोग करें:

@Deployment 
public static EnterpriseArchive createDeployment() { 
    EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "application-ear.ear") 
    .as(ZipImporter.class) 
    .importFrom(new File("../application-ear/target/application-ear-1.0-SNAPSHOT.ear")) 
    .as(EnterpriseArchive.class); 

    //now add the testClass and any test util classes that are not in the archive 
    JavaArchive testLibraryHelper = ShrinkWrap.create(JavaArchive.class) 
    .addClass(testClass) 
    .addPackage(MiscUtil.class.getPackage()) 
    .addPackage(some.other.UtilClass.class.getPackage()) 
    //now for CDI working in testLibraryHelper 
    .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    ear.addAsLibrary(testLibraryHelper); 
    return ear; 
} 
+0

क्या आप वेबस्पेयर ऐप सर्वर पारंपरिक या वेबस्पियर लिबर्टी का उपयोग करने की कोशिश कर रहे हैं? –

+0

क्या आप स्टैकट्रैक साझा कर सकते हैं? मेरा मानना ​​है कि इंजेक्शन सीधे परीक्षण के लिए समर्थन नहीं करता है, लेकिन आपके ऐप के भीतर नहीं - यह तब तक काम करना चाहिए जब तक आपके कंटेनर को इंजेक्शन देने के लिए समर्थन न हो (जो मुझे लगता है कि डब्ल्यूएएस के मामले में है)। –

+0

@ स्कॉट कुर्ज़: वेबस्पेयर ऐप सर्वर पारंपरिक – Lonzak

उत्तर

3

कुछ सुराग:

  1. सुनिश्चित करें कि आप सफलतापूर्वक सीडीआई के साथ सबसे सरल परीक्षण चला सकते हैं (इसलिए कृपया @PersistenceContext हटाएं) और सबसे छोटी संभव तैनाती बनाएं - इसलिए कृपया बिना किसी निर्भरता के एक एकल सीडीआई बीन तैयार करें।
  2. पूरी तरह से सुनिश्चित करें कि तैनात संग्रह सीडीआई-सक्षम है। इसमें beans.xml फ़ाइल शामिल है।

यदि आप मुझसे पूछते हैं, तो मैं शर्त लगाता हूं कि तैनाती के लिए संग्रह सही ढंग से तैयार नहीं है। यह आपकी गलती नहीं है, यह हमेशा एक जटिल, समय लेने वाला कार्य रहा है।

कृपया, बस परीक्षण प्रयोजनों के लिए, संग्रह प्रकार JavaArchive को बदल सकते हैं और JUnit नमूना नीचे की कोशिश:

@RunWith(Arquillian.class) 
@Category(IntegrationTest.class) 
public class AbcIT { 

    @Deployment 
    public static JavaArchive createDeployment() { 
    JavaArchive jar = ShrinkWrap.create(JavaArchive.class) 
      .addPackage("com.needed.package") 
      .addClass("com.needed.class") 
      .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); // CRUCIAL to make CDI work 

    System.out.println(jar.toString(true)); // Print to see the content 
    return jar; 
    } 

    @Inject 
    private WhateverService service; 

    // your test goes here... 
} 

बाद में, यदि ऊपर काम करेंगे, @PersistenceContext के साथ आगे आगे बढ़ें और देखें arquillian-was-remote-8-container-adapter यह समर्थन करता है तो अब (क्योंकि आपके द्वारा उल्लिखित दस्तावेज 2014 से हैं)।
यदि मैं आप थे, तो मैं आर्किलियन के समुदाय से पूछने की कोशिश भी करूंगा।

उम्मीद है कि यह मदद करता है।

+0

जावाआर्किव प्रकार WAS सर्वर – Lonzak

+0

द्वारा समर्थित नहीं है यह कैसे संभव हो सकता है? क्या आप 100% निश्चित हैं? इसका मतलब यह होगा कि एक ईजेबी जार को वेबस्पेयर पर तैनात नहीं किया जा सकता है - जो हास्यास्पद लगता है। –

+0

हां यह मामला है। आपको जो त्रुटि मिलती है वह है: 'org.jboss.arquillian.container.spi.client.container.DeploymentException: परिनियोजन के लिए असमर्थित संग्रह प्रकार प्रदान किया गया है: org.jboss.shrinkwrap.impl.base.spec.JavaArchiveImpl'। मैं अपने परीक्षण – Lonzak

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