Проблемы с запуском интеграционного теста EJB - PullRequest
0 голосов
/ 11 октября 2011

Код из Enterprise JavaBeans 3.1, глава 4. Если вам нужно больше кода или информации, просто спросите!

public class SimpleCalculatorIntegrationTest {

    private static SimpleCalculatorBean calc;
    private static Context namingContext;
    private static final String JNDI_NAME_CALC = "java:global/SimpleCalculatorEJB/SimpleCalculatorBean";

    @BeforeClass
    public static void obtainProxyReferences() throws NamingException {
        namingContext = new InitialContext();

        calc = (SimpleCalculatorBean) namingContext.lookup(JNDI_NAME_CALC);
    }

    @Test
    public void testAddition() {

        int expectedSum = 1 + 2 + 3 + 4; // 10

        assertEquals(expectedSum, calc.add(1, 2, 3, 4));
    }
}

StackTrace:

11.okt.2011 20:41:28 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: Не удается найти JAR-файл клиента javadb, derby jdbc драйвер не будет доступен по умолчанию. java.lang.RuntimeException: Инициализация шара org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB (GlassFishORBHelper.java:180) в com.sun.enterprise.naming.impl.SerialContext.getORB (SerialContext.java:365) в com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey (SerialContext.java:372) в com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider (SerialContext.java:402) в com.sun.enterprise.naming.impl.SerialContext.getProvider (SerialContext.java:347) в com.sun.enterprise.naming.impl.SerialContext.lookup (SerialContext.java:504) в com.sun.enterprise.naming.impl.SerialContext.lookup (SerialContext.java:455) в javax.naming.InitialContext.lookup (InitialContext.java:392) в no.breakpoint.ejbbook.calculator.test.SimpleCalculatorIntegrationTest.obtainProxyReferences (SimpleCalculatorIntegrationTest.java:24) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Method.invoke (Method.java:597) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:44) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:41) в org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:27) в org.junit.runners.ParentRunner.run (ParentRunner.java:236) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:50) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) Вызывается: java.lang.NullPointerException at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB (GlassFishORBHelper.java:152) ... еще 23

1 Ответ

4 голосов
/ 12 октября 2011

Просто подведем итоги нашего чата для других заинтересованных пользователей:

Вы можете написать тесты, которые работают на вашем EJB, двумя способами:

  1. Тестирование вне-The-контейнер .Это означает, что ваши тесты запускаются как другое приложение на другой виртуальной машине Java.В этом случае вам нужно использовать EJB-представление интерфейса Remote и JNDI для определения местоположения EJB.Координаты JNDI создаются, как написано в спецификации EJB 3.1 относительно переносимого синтаксиса JNDI (стр. 81).В случае Glassfish вам просто нужно:
    • добавить удаленный интерфейс к вашему classpath (чтобы иметь возможность его использовать),
    • добавить gf-client.jar к вашему classpath.

Тогда вы сможете найти удаленный интерфейс вашего EJB, вызвав код, похожий на этот:

public class Main {

    private static final String JNDI = 
                    "java:global/yourApp/YourEJBBean!com.test.YourEJBBeanRemote";

    public static void main(String[] args) throws NamingException {
        Context ctx = new InitialContext();

        YourEJBBeanRemote sr = (YourEJBBeanRemote)ctx.lookup(JNDI);

        // Invoke some method on 'sr'
    }
}

2.Тестирование внутри контейнера .Это означает, что ваши тесты выполняются внутри контейнера и, скорее всего, вместе с вашим приложением.Это позволяет вам использовать внедрение зависимостей, EntityManager, представление локального / безинтерфейсного EJB и так далее.С JBoss Arquillian вы пишете свои тесты, просто предполагая, что все сервисы вам предоставлены.

Новое представление EJB 3.1 без интерфейса похоже на локальное представление, поэтому его нельзя использоватьдля клиентов, проживающих за пределами приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...