【问题标题】:Java Integration testing with Arquillian, database cleanup使用 Arquillian 进行 Java 集成测试,数据库清理
【发布时间】:2015-04-22 15:24:42
【问题描述】:

我正在做一些集成测试,我需要在测试之间清理数据库,这样我才能做出正确的断言,而且测试不会导致像 Failed while seeding databaseUnable to clean database. 这样的错误。

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 添加属性来禁用Referential Integrity

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

我怎样才能实现我想要的?有什么想法吗?

【问题讨论】:

    标签: java integration-testing jboss-arquillian


    【解决方案1】:

    您可以在persistence.xml 中将数据库模式设置为drop-create。这将强制每次重新部署时都从头开始重建数据库(这很重要!)

    【讨论】:

      【解决方案2】:

      您必须仔细查看错误消息的堆栈跟踪。通常,根据我的经验,由于外键约束,无法清理数据库......但详细信息应该出现在堆栈跟踪中。

      我不知道您对参照完整性的停用是否是这样的。我使用注释 @ApplyScriptBefore 来禁用它。

      【讨论】:

        【解决方案3】:

        我喜欢使用 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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-22
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多