Как получить источник данных JNDI для интеграционного теста JPA / JTA DAO? - PullRequest
2 голосов
/ 09 июня 2010

У меня есть приложение JPA, в котором указаны транзакции JTA в файле persistence.xml. По какой-то причине я обнаружил, что при использовании JTA вы ДОЛЖНЫ также указывать источник данных JNDI в файле persistence.xml. Это нормально, если только вы не пытаетесь пройти интеграционное тестирование вне контейнера, а JNDI недоступен.

Мои вопросы:

a) есть ли способ вставить источник данных jdbc в мой менеджер транзакций JTA? б) если нет, то как обрабатывать поиск JNDI во время интеграционного тестирования?

Редактировать: ошибка при запуске интеграционного теста:

 Caused by: org.springframework.......DataSourceLookupFailureException:
 Failed to look up JNDI DataSource with name 'java:comp/env/jdbc/myAppDataSource';
 nested exception is javax.naming.NoInitialContextException: Need to specify
 class name in environment or system property, or as an applet parameter,
 or in an application resource file:  java.naming.factory.initial

Ответы [ 2 ]

1 голос
/ 10 июля 2012

Я столкнулся с подобной проблемой сам. Я использую Spring с JPA и указываю свою базу данных в качестве имени JNDI. В конце концов я решил просто макетировать JNDI, используя Mockito. Это было довольно легко. Вот как я это сделал:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-config.xml"})
public class MyTestClass {

    private static final InitialContextFactoryBuilder contextFactoryBuilder = mock(InitialContextFactoryBuilder.class);
    private static final InitialContextFactory contextFactory = mock(InitialContextFactory.class);
    private static final Context context = mock(Context.class);
    private static final NameParser parser = mock(NameParser.class);
    private static final Name dbName = mock(Name.class);
    // This is the Datasource implementation from the H2 database
    private static final JdbcDataSource temporaryDbForTesting = new JdbcDataSource();

    @BeforeClass
    public static void setupMockJndi() throws NamingException {
        NamingManager.setInitialContextFactoryBuilder(contextFactoryBuilder);
        when(contextFactoryBuilder.createInitialContextFactory(any(Hashtable.class))).thenReturn(contextFactory);
        when(contextFactory.getInitialContext(any(Hashtable.class))).thenReturn(context);
        when(context.getNameParser(any(String.class))).thenReturn(parser);
        when(parser.parse("GatewayDbDataSource")).thenReturn(dbName);
        when(context.lookup(dbName)).thenReturn(temporaryDbForTesting);

        temporaryDbForTesting.setURL("jdbc:h2:~/test2");
        temporaryDbForTesting.setUser("sa");
        temporaryDbForTesting.setPassword("");
    }

    @Autowired
    private org.zzz.DomainObject toTest;

    @Test
    public void testPasswordChecking() {
        assertNotNull("There wasn't an object to test. Spring is broken!", toTest);
        // ... assertions and such ...
    }

}
1 голос
/ 10 июня 2010

Я сам не экспериментировал с этим, но это выполнимо с помощью автономного менеджера транзакций и XA-совместимого источника данных.В Spring 2.5 большинство образцов используют JOTM и JotmFactoryBean и XAPool .Но они больше не поддерживаются в Spring 3.0, и Atomikos представляется «заменой» (он предоставляет автономный менеджер транзакций и источник данных XA).Ниже я добавил несколько примеров конфигурации.

Альтернативой может быть запуск тестов в контейнере (с использованием встроенного контейнера Java EE, например GlassFish v3 Embedded или API, например Cargo).

Ресурсы

...