Ошибка инициализации контекста гибернации при запуске Maven Test - PullRequest
0 голосов
/ 08 марта 2012

Я забираю существующий проект Spring / JPA (w / hibernate) / Maven и пытаюсь интегрировать модульное тестирование и интеграционное тестирование.

Проект компилируется и работает нормально, но когда я запускаю Maven Test для запуска моего интеграционного теста на базе Spring, я сталкиваюсь с ошибкой, которую не могу понять:

org.hibernate.HibernateException: Could not find datasource
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:51)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:90)
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2836)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2832)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
... 75 more

Caused by: 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
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)
... 82 more

У меня есть догадка, что это связано с моей конфигурацией POM. Моя контекстная информация базы данных находится в файле context.xml, и предыдущий разработчик, похоже, связал этот файл с плагином tomcat? Означает ли это, что информация базы данных загружается только на tomcat: run?

Соответствующее содержание POM

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.1</version>
            <configuration>
                <path>/rms-online</path>
                <mode>both</mode>
                <port>80</port>
                <httpsPort>443</httpsPort>
                <scanIntervalSeconds>5</scanIntervalSeconds>
                <contextFile>src/main/resources/context.xml</contextFile>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.16</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
                <webResources>
                    <webResource>
                        <directory>${basedir}/src/main/resources</directory>
                        <includes>
                            <include>context.xml</include>
                        </includes>
                        <targetPath>META-INF</targetPath>
                        <filtering>true</filtering>
                    </webResource>
                    <webResource>
                        <directory>${basedir}/src/main/webapp/WEB-INF</directory>
                        <includes>
                            <include>web.xml</include>
                        </includes>
                        <targetPath>WEB-INF</targetPath>
                        <filtering>true</filtering>
                    </webResource>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
</build>

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context path="" reloadable="false">
<Resource
    name="jdbc/rmsDS"
    type="javax.sql.DataSource"
    maxActive="50"
    maxIdle="35"
    logAbandoned="true"
    username="xxx"
    password="xxx"
    maxWait="10000"
    validationQuery="select 1"
    driverClassName="com.mysql.jdbc.Driver"
    removeAbandoned="true"
    url="jdbc:mysql://127.0.0.1/rms?zeroDateTimeBehavior=convertToNull"
    removeAbandonedTimeout="300"/>
<Resource
    name="jdbc/rmsDeviceDS"
    type="javax.sql.DataSource"
    maxActive="50"
    maxIdle="35"
    logAbandoned="true"
    username='xxx'
    password='xxx'
    maxWait="10000"
    validationQuery="select 1"
    driverClassName="com.mysql.jdbc.Driver"
    removeAbandoned="true"
    url="jdbc:mysql://127.0.0.1/rms_device_processed?zeroDateTimeBehavior=convertToNull"
    removeAbandonedTimeout="300"/>  
</Context>

Есть идеи, почему я могу получить эту ошибку?

Я также приветствую любые предложения или примеры кода, показывающие, как настроить POM Maven для этого многомодульного проекта (родительский проект с дочерними проектами), чтобы он мог иметь модульные и интеграционные тесты в каждом модуле.

1 Ответ

1 голос
/ 08 марта 2012

context.xml - это файл конфигурации, специфичный для tomcat, поэтому, если вы запустите свои тесты вне веб-контейнера, он не будет использоваться. Решение состоит в том, чтобы определить источник данных для тестов в файле конфигурации пружины, который находится в src/test/resources (если вы следовали стандартной схеме проекта). Эта папка используется только для тестового пути к классам, поэтому она не будет мешать вашей развернутой конфигурации.

Ваши тесты должны будут инициализировать контекст приложения Spring, используя этот дополнительный файл.

...