Tomee с Arquillian, использующим базу данных Postgres, не имеет привилегий или объект не найден

У меня возникла проблема при запуске тестов arquillian против базы данных postgres с использованием tomee. Со всей информацией в Интернете я все еще пытаюсь решить проблему.

javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: 
    Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: CREDENTIALS
Error Code: -5501
Call: SELECT ID, PASSWORD, USERNAME FROM credentials WHERE (USERNAME = ?)
    bind => [phil]

БД:

Название: реестр

Таблица: учетные данные

Сидит под созданной вручную схемой: postgres

persistence.xml в каталоге src/main/resources

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

  <persistence-unit name="registry" transaction-type="JTA">
    <jta-data-source>RegistryDS</jta-data-source>
    <non-jta-data-source>UnmanagedRegistryDS</non-jta-data-source>
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>za.co.registry.client.login.Credentials</class>
    <properties>
      <property name="eclipselink.debug" value="OFF"/>
      <property name="eclipselink.weaving" value="static"/>
      <property name="eclipselink.logging.level.sql" value="FINE"/>
      <property name="eclipselink.logging.parameters" value="true"/>
      <property name="eclipselink.logging.logger" value="DefaultLogger"/>
    </properties>
  </persistence-unit>
</persistence>

tomee.xml

<Resource id="RegistryDS" type="DataSource">
          jdbcDriver=org.postgresql.Driver
          jdbcUrl=jdbc:postgresql://127.0.0.1:5432/registry
          userName=postgres 
          password=postgres 
          JtaManaged=true
</Resource>
<Resource id="UnmanagedRegistryDS" type="DataSource">
          jdbcDriver=org.postgresql.Driver
          jdbcUrl=jdbc:postgresql://127.0.0.1:5432/registry
          userName=postgres 
          password=postgres 
          JtaManaged=false
</Resource>

Экстракт pom.xml для тестов arquillian

<dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>arquillian-tomee-embedded</artifactId>
    <version>1.6.0</version>
    <scope>test</scope>
</dependency> 

<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <version>1.0.3.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>  

экстракт arquillian.xml

<container qualifier="tomee" default="true">
    <configuration>
        <property name="httpPort">-1</property>
        <property name="stopPort">-1</property>
        <property name="dir">target/apache-tomee-remote</property>
        <property name="appWorkingDir">target/arquillian-test-working-dir</property>
        <property name="properties" />
    </configuration>
</container>

Файл ServiceTest.java при загрузке ресурсов.

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive webArchive = newArchive();
        webArchive.addClasses(Credentials.class);
        webArchive.addAsResource("META-INF/persistence.xml");
        webArchive.addAsResource("META-INF/beans.xml");
        return webArchive;
    }

И последний метод test findCredentialsByUsernameTest в ServiceTest.java

@Test
public void findCredentialsByUsernameTest() {
    Credentials login = LoginService.findByUsername("phil");
    Assert.assertNotNull(login);
}

Я не начинаю и не заканчиваю EntityTransaction в тестовом классе.

Он работает, внедряя EJB, когда вызов БД в службе удален. Что я пропустил в конфигурации или делаю неправильно, чтобы это не работало?


person Rentius2407    schedule 28.03.2014    source источник
comment
у пользователя отсутствуют привилегии или объект не найден: CREDENTIALS не является сообщением об ошибке Postgres (соответствующая ошибка Postgres будет выглядеть так: учетные данные отношения не найдены). Однако сообщение об ошибке типично для HSQLDB. Вы уверены, что подключаетесь к правильной базе данных?   -  person a_horse_with_no_name    schedule 28.03.2014
comment
Привет @a_horse_with_no_name, я указал Postgres, потому что он является частью сценария и моей среды. В названии это может показаться немного забавным. Я думаю, что подключаюсь к правильной БД, но именно поэтому я предоставил всю информацию выше, чтобы кто-то помог и посмотрел, правильно ли я делаю конфигурацию.   -  person Rentius2407    schedule 28.03.2014
comment
Что ж, если вы подключаетесь к встроенной базе данных HSQLDB, то правильность настройки вашей базы данных Postgres не поможет.   -  person a_horse_with_no_name    schedule 28.03.2014
comment
Я тогда не уверен, что правильно делаю конфиг. Насколько я знаю, я нигде не подключаюсь к встроенной базе данных при выполнении теста. Должен ли я подключаться к встроенной базе данных при использовании тестов Arquillian/Integration? Я думал, что когда у меня будет встроенная установка arquillian tomee, он также будет использовать источник данных для моих тестов.   -  person Rentius2407    schedule 28.03.2014


Ответы (1)


Хорошо, я думаю, я знаю, что я сделал неправильно.

Мне нужно запустить тесты для встроенной базы данных.

Шаги, которые я выполнил, чтобы заставить тесты Arquillian работать со встроенной базой данных;

Удален неуправляемый источник данных из tomee.xml, я добавил его, потому что хотел использовать его для своих тестов. Другой источник данных все еще существует, потому что он используется при развертывании в tomee для подключения к postgres db.

<Resource id="UnmanagedRegistryDS" type="DataSource">
          jdbcDriver=org.postgresql.Driver
          jdbcUrl=jdbc:postgresql://127.0.0.1:5432/registry
          userName=postgres 
          password=postgres 
          JtaManaged=false
</Resource>

Я собираюсь подключиться к HSQLDB.

HSQLDB (HyperSQL DataBase) is the leading SQL relational database software written in Java. It offers a small, fast multithreaded and transactional database engine with in-memory and disk-based tables and supports embedded and server modes

Затем я создаю второй файл persistence.xml в src/test/resources с именем test-persistence.xml. Запомните имя модуля сохраняемости testDatabase, которое будет использоваться в файле arquillian.xml.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="test" transaction-type="JTA">
        <jta-data-source>testDatabase</jta-data-source>
        <class>za.co.registry.client.login.Credentials</class>
        <properties>
            <property name="openejb.jpa.init-entitymanager" value="true" />
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
        </properties>
    </persistence-unit>
</persistence>

В файле arquillian.xml я устанавливаю свойства блока сохраняемости testDatabase. См. ниже в свойствах.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<arquillian
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
    <container qualifier="openejb-embedded" default="true">
        <configuration>
            <property name="httpPort">-1</property>
            <property name="stopPort">-1</property>
            <property name="dir">target/apache-tomee-remote</property>
            <property name="appWorkingDir">target/arquillian-test-working-dir</property>
            <property name="properties">
                testDatabase = new://Resource?type=DataSource
                testDatabase.JdbcUrl = jdbc:hsqldb:mem:my-datasource
             </property>
        </configuration>
    </container>
</arquillian>

Настройка моего файла ServiceTest.java для включения нового файла persistence.xml.

webArchive.addAsWebInfResource("META-INF/test-persistence.xml", "persistence.xml");
webArchive.addAsResource("META-INF/beans.xml");

Теперь я могу запустить метод findCredentialsByUsernameTest.

    @Test
    public void findCredentialsByUsernameTest() {
        //create credentials first
        Credentials newCredentials = loginService.newCredentials(new Credentials("john", "password"));

        //search for credentails
        Credentials login = loginService.findByUsername("john");
        Assert.assertNotNull(login);
        Assert.assertEquals(newCredentials.getUsername(), login.getUsername());
    }
person Rentius2407    schedule 28.03.2014