2010-09-15 23 views
7

Je travaille sur une application Java EE 6. Quand j'ai commencé, j'écrivais des tests pour mes classes EJB en instanciant manuellement l'EJB, puis en ajoutant manuellement les membres qui étaient normalement fournis par injection de dépendance. Comme l'application devient plus compliquée, je trouve que cette approche ne suffit pas de le couper. Je voudrais donc pouvoir démarrer mon propre conteneur EJB dans le framework de test, afin qu'il puisse gérer mes beans. Quelle est la meilleure façon d'aborder cela? J'ai entendu parler de javax.ejb.embeddable.EJBContainer, y at-il d'autres options?Stratégies de test EJB?

(j'utilise Glassfish 3, et construire avec Maven, si cela fait une différence.)

Répondre

2

Que testez-vous exactement? Logique? Configuration? Avez-vous besoin de tester les classes EJB directement? Serait-il suffisant que vos tests se comportent comme un client EJB par rapport à un conteneur en cours d'exécution? (Rappelez-vous qu'aucune règle n'indique que les tests unitaires automatisés ne peuvent pas nécessiter un système en cours d'exécution.)

Si c'est une logique métier, vous devez tester, déplacer ce code dans POJOs et tester normalement; vous n'avez pas besoin de tester les POJO en cours d'exécution dans un conteneur, car le conteneur ne devrait pas affecter la logique métier.

Dans une situation connexe, je n'ai jamais directement testé JUnit une classe de servlet ou une classe de contrôleur Struts. Je teste définitivement les POJO dont ils dépendent, et je teste l'application finale (en cours d'exécution dans un conteneur de servlet, testé avec HtmlUnit), en supposant que si l'application finale fonctionne, la plomberie fonctionne aussi.

+0

Évidemment, tester les POJO est plus facile. Mais je ne peux pas sortir toute la logique de mes EJB et dans des classes autonomes - si je pouvais faire cela, je n'utiliserais pas les EJB en premier lieu. Agir comme un client EJB contre un conteneur en cours d'exécution est une bonne description de ce que j'essaie de faire, j'essaie juste de trouver la meilleure façon d'y parvenir. –

+0

Je pense que vous aviez raison de tester l'application déployée. J'ai essayé de faire fonctionner EJBContainer pour moi (en utilisant glassfish-embedded comme implémentation), j'ai fait beaucoup de cerceaux pour que la persistance fonctionne, puis j'ai fini quand je me suis rendu compte qu'un service de minuteur EJB (dont mon application dépend en plusieurs endroits) n'a pas été fourni. Je me suis rendu compte que même si je réussissais à mettre en place une sorte de moteur pour exécuter mes EJB, il ne reproduirait jamais TOUTES les conditions dans un vrai conteneur, donc ce serait un test inutile. –

+4

'Rappelez-vous qu'il n'y a pas de règle qui stipule que les tests unitaires automatisés ne peuvent pas nécessiter un système en cours d'exécution. Eh bien, il existe des règles et ces tests ne sont pas des tests unitaires par définition :) –

0

Je ne suis pas tout à fait sûr que cela aide votre cas, mais un coup d'oeil à Smokestack. Personnellement, je ne travaille pas dans l'espace EE (en dehors de la spécification Servlet) mais j'ai vu une présentation sur ce sujet à un moment donné et il semble que cela puisse faire ce dont vous avez besoin.

2

J'ai entendu parler de javax.ejb.embeddable.EJBContainer, existe-t-il d'autres options?

L'API EJBContainer est une option. L'autre serait d'utiliser Arquillian (et SchrinkWrap).

Quelques autres liens:

+0

Arquillian a l'air plutôt sympa, mais il ne semble pas offrir un service de minuteur EJB, donc dans mon cas, il aurait une utilité limitée. Voir aussi ma réponse à Rodney. –

+0

@Mike Êtes-vous sûr que * glassfish embedded ne fournit pas un service de minuterie EJB? AFAIK, glassfish embedded est un "vrai" conteneur. –

+0

Il semble que ce soit DEVRAIT être disponible, mais quand je l'utilisais via l'API EJBContainer, j'ai reçu un message d'erreur sur le fait que le service de minuteur n'était pas disponible. Je n'ai trouvé aucune documentation pertinente, à l'exception d'un bref message indiquant que glassfish-embedded ne dispose pas d'un service de minuterie. Il pourrait y avoir un moyen de le faire fonctionner, mais je n'ai pas le temps de le comprendre, et je peux obtenir ce dont j'ai besoin d'autres façons. –

0

Maintenant, il y a Arquillian, les développeurs ne devraient pas avoir besoin de bricoler avec des conteneurs Java EE embarqués plus.