2015-04-22 55 views
1

我正在進行一些集成測試,並且需要在測試之間清理數據庫,以便我可以進行正確的斷言,並且測試不會導致像Failed while seeding databaseUnable to clean database.這樣的錯誤。使用Arquillian進行Java集成測試,數據庫清理

POM:

<dependencyManagement> 
    <dependencies> 
    <dependency> 
    <groupId>org.jboss.arquillian</groupId> 
    <artifactId>arquillian-bom</artifactId> 
    <version>1.1.2.Final</version> 
    <scope>import</scope> 
    <type>pom</type> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependency> 
    <groupId>org.jboss.arquillian</groupId> 
    <artifactId>arquillian-bom</artifactId> 
    <version>1.1.2.Final</version> 
    <type>pom</type> 
</dependency> 
<dependency> 
    <groupId>org.jboss.arquillian.container</groupId> 
    <artifactId>arquillian-glassfish-embedded-3.1</artifactId> 
    <version>1.0.0.CR4</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.arquillian.junit</groupId> 
    <artifactId>arquillian-junit-container</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.arquillian.extension</groupId> 
    <artifactId>arquillian-persistence-api</artifactId> 
    <version>1.0.0.Alpha5</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.arquillian.extension</groupId> 
    <artifactId>arquillian-persistence-impl</artifactId> 
    <version>1.0.0.Alpha5</version> 
    <scope>test</scope> 
</dependency> 

一些測試類:

@RunWith(Arquillian.class) 
@UsingDataSet("datasets/empty.yml") 
public class SomeServiceCase { 

@EJB 
SomeService someService; 

@Deployment 
public static JavaArchive createDeployment() { 
    return ShrinkWrap.create(JavaArchive.class) 
      .addPackages(true, "vo") 
      .addPackages(true, "service") 
      .addPackages(true, "domain") 
      .addAsManifestResource("test-persistence.xml", ArchivePaths.create("persistence.xml")); 
} 


@Test 
@UsingDataSet("datasets/someModel/someModels.yml") 
@Cleanup(phase = TestExecutionPhase.AFTER, strategy = CleanupStrategy.STRICT) 
public void teastSomething() { 
    //modifies database content here 
} 

@Test 
@UsingDataSet("datasets/someModel/someModels.yml") 
@Cleanup(phase = TestExecutionPhase.AFTER, strategy = CleanupStrategy.STRICT) 
public void testSomethingElse() { 
    //needs initial database content for tests to work 
} 

嚴格清理策略應該清除數據庫,但它失敗,因爲外國鍵。所以,我想通過添加屬性arquillian.xml

<property name="initStatement">SET REFERENTIAL_INTEGRITY FALSE</property> 

我怎樣才能達到我想要禁用Referential Integrity?有任何想法嗎?

回答

0

您必須在錯誤消息的堆棧跟蹤中仔細觀察。通常,從我所經歷的情況來看,由於外鍵約束,無法清理數據庫......但細節應該出現在堆棧跟蹤中。

我不知道你的參照完整性是否失效。我使用註解@ApplyScriptBefore來禁用它。

1

您可以在persistence.xml中將數據庫模式設置爲drop-create。這將迫使數據庫從頭重新爲每次重新部署(這是東西!)

0

我喜歡用liquibase來解決這個問題。這是很容易的Maven插件使用如下:

   <plugin> 
        <groupId>org.liquibase</groupId> 
        <artifactId>liquibase-maven-plugin</artifactId> 

        <executions> 
         <execution> 
          <id>update_test</id> 
          <phase>process-test-classes</phase> 
          <configuration> 
           <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase> 
           <url>${test.db.connectionURL}</url> 
           <defaultSchemaName>${test.hibernate.default_schema}</defaultSchemaName> 
           <username>${test.db.username}</username> 
           <password>${test.db.password}</password> 
           <changeLogFile>db/db.changelog.xml</changeLogFile> 
           <contexts>test</contexts> 
           <changelogSchemaName>${test.hibernate.default_schema}</changelogSchemaName> 
          </configuration> 
          <goals> 
           <goal>dropAll</goal> 
           <goal>update</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 

,做滴和更新我們的目標是:

<goal>dropAll</goal> 
<goal>update</goal> 
相關問題