Dziękuję wszystkim za pomoc. Pewna liczba osób, które opublikowałeś (jak powinienem się spodziewać), wskazujące na to, że moje podejście było błędne, lub że kod niskiego poziomu nigdy nie powinien wiedzieć, czy działa w kontenerze. Zgodziłbym się. Mam jednak do czynienia ze złożoną aplikacją starszego typu i nie mam możliwości przeprowadzenia poważnego refaktoryzacji dla bieżącego problemu.W jaki sposób testy jednostek powinny konfigurować źródła danych, gdy nie są uruchomione na serwerze aplikacji?
Pozwól, że cofnę się i zadam pytanie, które umotywowało moje pierwotne pytanie.
Mam starszą aplikację działającą pod JBoss i dokonałem pewnych modyfikacji kodu niższego poziomu. Stworzyłem test jednostkowy dla mojej modyfikacji. Aby uruchomić test, muszę połączyć się z bazą danych.
Kod Legacy dostaje źródło danych w ten sposób:
(jndiName jest określony ciąg znaków)
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(jndiName);
Moim problemem jest to, że gdy uruchamiam ten kod pod testów jednostkowych, kontekst nie ma danych zdefiniowane źródła. Moim rozwiązaniem tego problemu było sprawdzenie, czy działa pod serwerem aplikacji, a jeśli nie, utworzenie testu DataSource i zwrócenie go. Jeśli używam serwera aplikacji, używam powyższego kodu.
Tak, moje prawdziwe prawdziwe pytanie brzmi: Jaki jest prawidłowy sposób to zrobić? Czy istnieje jakiś zatwierdzony sposób, w jaki test jednostki może ustawić kontekst, aby zwrócić odpowiednie źródło danych, tak aby testowany kod nie musiał wiedzieć, gdzie jest uruchomiony?
Dla Context: My oryginalne pytanie:
Mam niektóre kodu Java, który musi wiedzieć, czy nie jest uruchomiony pod JBoss. Czy istnieje kanoniczny sposób na określenie, czy kod działa w kontenerze?
Moje pierwsze podejście zostało rozwinięte poprzez eksperymenty i polega na uzyskaniu początkowego kontekstu i testowaniu, że może on wyobrazić sobie pewne wartości.
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)
{
.........
Teraz wydaje się działać, ale wydaje się, że jest hackerem. Jaki jest "właściwy" sposób na zrobienie tego? Idealnie byłoby, gdyby działał z różnymi serwerami aplikacji, nie tylko JBoss.
Zakładam, że zamiast JBoss masz na myśli Tomcat? (Który jest osadzony w JBoss). – Eddie
Czy próbujesz określić kontener kontra nie-kontener lub typ kontenera, w którym działa aplikacja? – Kapsh
Czy możesz rozwinąć, dlaczego musisz wiedzieć, czy działa w kontenerze? To może pomóc w uzyskaniu odpowiedzi. –