2015-04-20 5 views
5

In einem Java-Projekt arbeite ich an habe ich die folgende Setup für unsere Unit-Tests bekam:Wie kann ich die Verarbeitung von hibernate.hbm2ddl.import_files Wert kombiniert mit hsqldb debuggen?

  • I Frühlings-Test MVC bin mit, @RunWith(SpringJUnit4ClassRunner.class) und @WebAppConfiguration die Unit-Tests laufen, und ich erstellen MockMvc Instanz mit webAppContextSetup(webApplicationContext), um die Anwendung zu testen.
  • Ich habe eine Hibernate-Konfiguration, um eine speicherinterne HSQLDB einzurichten, alle Tabellen werden basierend auf den @Entity-Klassen erstellt.
  • In der Hibernate-Konfiguration, setze ich die hibernate.hbm2ddl.import_files Eigenschaft, um eine Datei import.sql mit SQL-Anweisungen zu laden, um die (In-Memory) -Datenbank zu füllen. Jetzt

, ich habe alle diese oben genannten Arbeiten bestätigt:

  • Tests erfolgreich einsetzen/abrufen aus der In-Memory-DB.
  • Die SQL-Anweisungen in der import.sql werden ausgeführt, wie verschiedene Tests bestätigen.

Nun ist das Problem: Fehler mit Aussagen vorkommenden ich in import.sql hinzufügen scheint nicht überall gemeldet werden, noch ist jeder gegebene Hinweis darauf, dass ein Fehler überhaupt stattgefunden. Stattdessen werden nachfolgende Anweisungen einfach nicht ausgeführt. (Ich habe dies durch Tests bestätigt.)

Gibt es eine Möglichkeit oder Ort diese Fehler sind berichtet, dass ich anscheinend nicht bewusst bin? Gibt es dafür eine zusätzliche Hibernate-Eigenschaft?

Auszug aus Hibernate Test config:

<bean id="sessionFactory" name="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.archive.autodetection">class,hbm</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop> 
       <prop key="hibernate.connection.username">sa</prop> 
       <prop key="hibernate.connection.password"></prop> 
       <prop key="hibernate.connection.url">jdbc:hsqldb:mem:myschema</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.hbm2ddl.import_files">configuration/test/import.sql</prop> 
       <prop key="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</prop> 
       <!-- when using type="yes_no" for booleans, the line below allow booleans in HQL expressions: --> 
       <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop> 
      </props> 
     </property> 
    </bean> 

Antwort

1

nicht wirklich eine Antwort auf Ihre Frage, aber alternative Art und Weise Test DB Bevölkerung zu behandeln.

Im Frühjahr gibt es einen XML-Namespace mit der Bezeichnung jdbc, mit dem Sie Ihre Datenbank während des Startvorgangs im Spring-Kontext mit ersten Daten auffüllen können. Auch meldet es Fehler in Ihrem SQLs ganz gut:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/jdbc 
     http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"> 

    <jdbc:initialize-database data-source="dataSource"> 
     <jdbc:script location="org/mytestproject/schema-drop-hsqldb.sql" /> 
     <jdbc:script location="org/mytestproject/schema-hsqldb.sql" /> 
     <jdbc:script location="org/mytestproject/data-hsqldb.sql" /> 
    </jdbc:initialize-database> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${jdbc.driver}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
     <property name="validationQuery" value="${jdbc.validationQuery}"/> 
    </bean> 
</beans> 
+0

Vielen Dank für diese Alternative. Wenn ich es implementiere, tritt ein Fehler bezüglich der Nicht-Existenz einer benutzten Tabelle auf. Könnte es sein, dass diese Methode die import.sql ausführt, bevor Hibernate die Tabellen automatisch erstellt? –

+0

Ja, Hinzufügen hängt von Hibernate SessionFactory ab. In meinem Beispiel erstellt und löscht Spring Tabellen direkt in SQL. – hoaz

+0

Leider bin ich dabei, dass ich Hibernate's Auto-Creating hier verwenden muss ... Danke trotzdem, weitere Vorschläge sind willkommen! –

0

Sie die Protokollierung auf Klasse aktivieren können org.hibernate.tool.hbm2ddl.SchemaExport mit Level TRACE.

Einige Fehler bei DEBUG Ebene angemeldet sind (zum Beispiel Datei nicht gefunden):

10:29:21,039 DEBUG SchemaExport:353 - Import file not found: ../myFile.sql