Тестирование ServiceLocator с использованием JUnit

Это дополнительный вопрос к моему предыдущему вопросу.

Я пытаюсь написать контрольный пример для моего класса ServiceLocator, но он дает мне следующую ошибку:

com/iplanet/ias/admin/common/ASException
java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException
        at java.lang.ClassLoader.defineClass1(Native Method)

Мой тестовый пример:

public void testServiceLocator () throws UivException, NamingException
{
    DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/RSRC/my/mydb");
    //I have not put any assert statements because i know above line is failing
}

Вышеприведенный код не работает на getInstance() метод, который выглядит так:

static public ServiceLocator getInstance() throws UivException {
    try {
        if (me == null) {
          synchronized(ServiceLocator.class) {
            me = new ServiceLocator();
          }
        }
        return me;
    }
    catch (UivException e) {
          throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR,
                                 ErrorCode.SERVICE_LOCATOR_LOOKUP_ERROR,
                                 e.getMessage());
    }
}

я знаю это ServiceLocator работает нормально, потому что когда я тестирую свое приложение из внешнего интерфейса, проблем нет. Единственная причина, по которой я пишу этот контрольный пример, заключается в том, что я хочу проверить свой DAO. И для меня, чтобы проверить мой DAO ServiceLocator должен работать (от JUnit).

Я понятия не имею, что делать с сообщением об ошибке. Кто-нибудь хочет предложить что-то, что я могу попробовать, что, надеюсь, сработает?

РЕДАКТИРОВАТЬ: конструктор ServiceLocator

private ServiceLocator() throws UivException  {
    try {
        ic = new InitialContext();
        // System.out.println("Created the Initial Context");
        cache = Collections.synchronizedMap(new HashMap());
    }
    catch (NamingException ne) {
        throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR,
                               0, ne.getMessage());
    }
    catch (NullPointerException e) {
          throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR,
                                 0, e.getMessage());
    }
}

3 ответа

Решение

Ну, это com.iplanet.ias.admin.common.ASException на пути к классам, когда вы вызываете свои тесты?

Вы полагаетесь на сервер приложений, чтобы иметь библиотеки драйвера JDBC в своем пути к классам, или вы развертываете его самостоятельно?

На самом деле, ошибка довольно очевидна: java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException указывает на то, что определение ASException не может быть найден во время выполнения.

При запуске на сервере приложений этот класс предоставляется iPlanet Application Server, и код работает нормально. Чтобы запустить этот код вне контекста сервера приложений, вам придется предоставить его "вручную", поместив его в classpath. Таким образом, вы должны добавить правильный iPARet JAR в путь к классам (это сложная часть, вам нужно будет найти какую).

Кроме того, я вижу, что вы используете InitialContext не аргументный конструктор, поэтому вы используете настройки среды iPlanet при работе внутри сервера приложений. За пределами iPlanet (например, для модульного теста) вам нужно будет предоставить правильные свойства JNDI для iPlanet самостоятельно. Для этого вам нужно будет поставить jndi.properties файл в classpath с (по крайней мере) исходной фабрикой контекста и URL провайдера. Что-то вроде этого:

java.naming.factory.initial=...
java.naming.provider.url=...

Проверьте значения в документации iPlanet.

Мне любопытно, почему вы пишете сервисный локатор. Это часть задания? В реальном мире Dependency Injection является явно лучшим выбором, используя Guice или Spring.

Другие вопросы по тегам