2017-01-09 53 views
7

Do naszych testów integracyjnych chciałem użyć Arquilliana i wykonać wszystkie kroki w "rozpoczęciu pracy tutorial". Ponieważ mam istniejącą aplikację, rzeczy nie są tak proste do skonfigurowania, ale udało mi się rozwiązać większość problemów. Teraz otrzymuję wyjątek NPE, który wskazuje, że CDI nie działa. Zgodnie z dokumentacją WAS 8.5 remote container zdałem sobie sprawę, że @PersistenceContext nie jest obsługiwane. To niefortunne, ponieważ prawdopodobnie nie mogę użyć Arquilliana, czy jest jakaś inna możliwość?Arquillian na zdalnym kontenerze WAS i @PersistenceContext

Uproszczona struktura kodu:

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; 
} 

więc istnieje możliwość, aby przetestować aplikację z Arquillian i WAS zdalnego kontenera?

Aktualizacja: Oto StackTrace:

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) 

Aktualizacja:

Ponieważ nie mogę przetestować z łatwym JarArchive używam następujących czynności, aby utworzyć shrinkwrap Przedsiębiorstwo takiego:

@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

Czy próbujesz użyć serwera WebSphere App Server w wersji tradycyjnej lub WebSphere Liberty? –

+0

Czy możesz udostępnić stos śledzenia? Uważam, że zastrzyk nie jest bezpośrednio wspierany w teście, ale nie w twojej aplikacji - to powinno działać tak długo, jak twój pojemnik ma poparcie dla wstrzykiwania go (co moim zdaniem ma miejsce w przypadku WAS). –

+0

@Scott Kurz: WebSphere App Server tradycyjny – Lonzak

Odpowiedz

3

kilka wskazówek:

  1. Upewnij się, że możesz z powodzeniem przeprowadzić najprostszy test z CDI (więc usuń @PersistenceContext) i stwórz najmniejsze możliwe wdrożenie - przygotuj więc pojedynczą warstwę CDI bez żadnych zależności.
  2. Należy bezwzględnie upewnić się, że wdrożone archiwum to z obsługą CDI. Musi zawierać plik beans.xml.

Jeśli zapytasz mnie, założę się, że archiwum do wdrożenia nie jest poprawnie przygotowane. To nie twoja wina, to zawsze było skomplikowane, czasochłonne zadanie.

Proszę, tylko do celów testowych, zmienić typ archiwum do JavaArchive i spróbować poniżej próbki 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... 
} 

Później, jeśli powyższe będzie działać, postępować dalej z @PersistenceContext i sprawdzić, czy arquillian-was-remote-8-container-adapter obsługuje teraz (ponieważ wspomniana dokumentacja pochodzi z 2014 roku).
Gdybym był tobą, chciałbym także zapytać społeczność Arquilliana.

Mam nadzieję, że to pomaga.

+0

Typ JavaArchive nie jest obsługiwany przez serwer WAS. – Lonzak

+0

Jak to możliwe? Czy jesteś w 100% pewien? Oznaczałoby to, że słoju nie można wdrożyć na serwerze WebSphere - co brzmi niedorzecznie. –

+0

Tak, tak jest. Otrzymany błąd to: 'org.jboss.arquillian.container.spi.client.container.DeploymentException: dla wdrożenia wdrożono nieobsługiwany typ archiwum: org.jboss.shrinkwrap.impl.base.spec.JavaArchiveImpl'. To dlatego używam pliku 'EnterpriseArchive' w moich testach. – Lonzak