ご協力ありがとうございました。私のアプローチ全体が間違っていたこと、または低レベルのコードがコンテナーで実行されているかどうかを知る必要がないことを示す回答を (私が予想していたはずですが) 投稿した多くの人がいます。私は同意する傾向があります。しかし、私は複雑なレガシー アプリケーションを扱っており、現在の問題に対して主要なリファクタリングを行うオプションはありません。
一歩下がって、元の質問の動機となった質問をしてみましょう。
JBoss で実行しているレガシー アプリケーションがあり、下位レベルのコードにいくつかの変更を加えました。変更の単体テストを作成しました。テストを実行するには、データベースに接続する必要があります。
レガシ コードは、次の方法でデータ ソースを取得します。
(jndiName は定義済みの文字列です)
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(jndiName);
私の問題は、単体テストでこのコードを実行すると、Context にデータ ソースが定義されていないことです。これに対する私の解決策は、アプリケーション サーバーで実行されているかどうかを確認し、そうでない場合は、テスト用の DataSource を作成して返すことでした。アプリ サーバーで実行している場合は、上記のコードを使用します。
だから、私の本当の質問は次のとおりです。これを行う正しい方法は何ですか? テスト対象のコードが実行されている場所を認識する必要がないように、適切なデータ ソースを返すように単体テストでコンテキストを設定できる承認された方法はありますか?
コンテキストについて: 私の元の質問:
JBoss で実行されているかどうかを知る必要がある Java コードがいくつかあります。コードがコンテナー内で実行されているかどうかを確認する標準的な方法はありますか?
私の最初のアプローチは、実験を通じて開発されたもので、初期コンテキストを取得し、特定の値を検索できることをテストすることで構成されています。
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)
{
.........
さて、これは機能しているように見えますが、ハックのように感じます. これを行う「正しい」方法は何ですか?理想的には、JBoss だけでなく、さまざまなアプリケーション サーバーで動作する方法が必要です。