Merci à tous pour votre aide. Un certain nombre d'entre vous ont répondu (comme j'aurais dû le prévoir) des réponses indiquant que toute mon approche était erronée, ou que le code de bas niveau ne devrait jamais avoir à savoir s'il fonctionne ou non dans un conteneur. J'aurais tendance à être d'accord. Cependant, j'ai affaire à une application héritée complexe et je n'ai pas la possibilité d'effectuer un refactoring majeur pour le problème actuel. Permettez-moi de revenir en arrière et poser la question la motivée de ma question initiale.Comment les tests unitaires doivent-ils configurer les sources de données lorsqu'elles ne sont pas exécutées sur un serveur d'applications?
J'ai une application héritée fonctionnant sous JBoss, et j'ai apporté quelques modifications au code de niveau inférieur. J'ai créé un test unitaire pour ma modification. Pour exécuter le test, j'ai besoin de me connecter à une base de données.
Le code existant obtient la source de données de cette façon:
(jndiName est une chaîne définie)
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(jndiName);
Mon problème est que quand je lance ce code sous test unitaire, le contexte n'a pas de données sources définies. Ma solution à ceci était d'essayer de voir si je cours sous le serveur d'application et, sinon, créez le DataSource de test et le renvoyez. Si je cours sous le serveur d'application, j'utilise le code ci-dessus.
Donc, mon réel question est: Quelle est la bonne façon de faire cela? Existe-t-il une méthode approuvée permettant au test unitaire de configurer le contexte pour renvoyer la source de données appropriée afin que le code testé ne sache pas où il s'exécute?
pour le contexte: MA QUESTION ORIGINAL:
J'ai un code Java qui a besoin de savoir si oui ou non il est en cours d'exécution sous JBoss. Existe-t-il un moyen canonique pour que le code indique s'il s'exécute dans un conteneur?
Ma première approche a été développée par experimention et consiste à obtenir le contexte initial et à tester qu'il peut rechercher certaines valeurs.
private boolean isRunningUnderJBoss(Context ctx) {
boolean runningUnderJBoss = false;
try {
// The following invokes a naming exception when not running under
// JBoss.
ctx.getNameInNamespace();
// The URL packages must contain the string "jboss".
String urlPackages = (String) ctx.lookup("java.naming.factory.url.pkgs");
if ((urlPackages != null) && (urlPackages.toUpperCase().contains("JBOSS"))) {
runningUnderJBoss = true;
}
} catch (Exception e) {
// If we get there, we are not under JBoss
runningUnderJBoss = false;
}
return runningUnderJBoss;
}
Context ctx = new InitialContext();
if (isRunningUnderJboss(ctx)
{
.........
Maintenant, cela semble fonctionner, mais il se sent comme un hack. Quelle est la "bonne" façon de faire cela? Idéalement, je voudrais un moyen qui fonctionne avec une variété de serveurs d'applications, pas seulement JBoss.
Je suppose, plutôt que JBoss, que vous voulez dire Tomcat? (Qui est incorporé dans JBoss.) – Eddie
Essayez-vous de déterminer conteneur vs non-conteneur ou le type de conteneur dans lequel l'application s'exécute? – Kapsh
Pourriez-vous développer pourquoi vous avez besoin de savoir si son fonctionnement dans un conteneur? Cela pourrait aider à orienter les réponses. –