2017-01-09 3 views
7

Pour nos tests d'intégration, j'ai voulu utiliser Arquillian et j'ai suivi toutes les étapes du 'Getting started tutorial'. Depuis que j'ai une application existante, les choses ne sont pas si triviales à mettre en place mais j'ai réussi à résoudre la plupart des problèmes. Maintenant, je reçois une exception NPE qui indique que CDI ne fonctionne pas. Selon la documentation WAS 8.5 remote container, j'ai réalisé que @PersistenceContext n'est pas supporté. C'est malheureux puisque je ne peux probablement pas utiliser Arquillian ou y a-t-il une autre possibilité?Arquillian sur le conteneur distant WAS et @PersistenceContext

La structure du code simplifié:

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

Ainsi est-il possible de tester ma demande avec Arquillian et le WAS conteneur à distance?

Mise à jour: Voici le 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) 

Mise à jour:

Puisque je ne peux pas tester avec un JarArchive facile que j'utilise ce qui suit pour créer une entreprise shrinkwrap comme ceci:

@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

Essayez-vous d'utiliser WebSphere App Server traditionnel ou WebSphere Liberty? –

+0

Pouvez-vous partager la pile de pile? Je crois que l'injection ne supporte pas directement le test, mais pas au sein de votre application - cela devrait fonctionner tant que votre conteneur a le support pour l'injecter (ce que je crois est le cas pour WAS). –

+0

@Scott Kurz: Serveur WebSphere App traditionnel – Lonzak

Répondre

3

Quelques indices:

  1. Assurez-vous que vous pouvez exécuter le test le plus simple avec CDI (veuillez donc supprimer un @PersistenceContext) et créer le plus petit déploiement possible - veuillez donc préparer un seul bean CDI sans aucune dépendance.
  2. Assurez-vous que l'archive déployée est activée par CDI. Il doit contenir le fichier beans.xml.

Si vous me demandez, je serais prêt à parier que l'archive pour le déploiement n'est pas correctement préparée. Ce n'est pas de votre faute, cela a toujours été une tâche complexe et longue.

S'il vous plaît, juste pour les fins de test, changer le type d'archive à JavaArchive et essayer ci-dessous exemple 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... 
} 

plus tard, si le ci-dessus fonctionnera, aller plus loin avec @PersistenceContext et vérifier si arquillian-was-remote-8-container-adapter le supporte maintenant (parce que la documentation que vous avez mentionnée date de 2014).
Si j'étais vous, j'essaierais aussi de demander à la communauté d'Arquillian.

Espérons que ça aide.

+0

Le type JavaArchive n'est pas pris en charge par le serveur WAS – Lonzak

+0

Comment cela a-t-il été possible? Êtes-vous sûr à 100%? Cela signifierait qu'un pot ejb ne peut pas être déployé sur un WebSphere - ce qui semble ridicule. –

+0

Oui c'est le cas. L'erreur que vous obtenez est: 'org.jboss.arquillian.container.spi.client.container.DeploymentException: un type d'archive non pris en charge a été fourni pour le déploiement: org.jboss.shrinkwrap.impl.base.spec.JavaArchiveImpl'. C'est pourquoi j'utilise un fichier 'EnterpriseArchive' dans mes tests – Lonzak