当前位置: 首页 > 知识库问答 >
问题:

当我使用liquibase更改模型数据时,JHipster集成测试失败

蒋胡非
2023-03-14

我认为它正在发生:

  1. 我尝试执行测试。
  2. H2数据库用每个changelog(初始和海关)初始化
  3. 开始执行测试。
  4. 在每次测试之前,不会删除H2数据库,而是调用changelog(或者只调用我的自定义changelog)。
  5. 我的自定义changelogs失败,因为它找不到在点2时删除的登录列,并且它不是由初始ChangeLog“Restaured”的。

完整版本:我用4.8.0生成了一个JHipster应用程序。My.yo-rc.json:

{
  "generator-jhipster": {
    "promptValues": {
      "packageName": "com.company.name",
      "nativeLanguage": "es"
    },
    "jhipsterVersion": "4.8.0",
    "baseName": "name",
    "packageName": "com.company.name",
    "packageFolder": "com/company/name",
    "serverPort": "8080",
    "authenticationType": "jwt",
    "hibernateCache": "no",
    "clusteredHttpSession": false,
    "websocket": false,
    "databaseType": "sql",
    "devDatabaseType": "postgresql",
    "prodDatabaseType": "postgresql",
    "searchEngine": false,
    "messageBroker": false,
    "serviceDiscoveryType": false,
    "buildTool": "gradle",
    "enableSocialSignIn": false,
    "enableSwaggerCodegen": false,
    "jwtSecretKey": "secret",
    "clientFramework": "angularX",
    "useSass": true,
    "clientPackageManager": "yarn",
    "applicationType": "monolith",
    "testFrameworks": [],
    "jhiPrefix": "jhi",
    "enableTranslation": true,
    "nativeLanguage": "es",
    "languages": [
      "es"
    ]
  }
}
<?xml version="1.0" encoding="UTF-8" ?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd
                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="20170913130000" author="svalero">
        <dropColumn columnName="login" tableName="jhi_user" />
    </changeSet>
</databaseChangeLog>
<?xml version="1.0" encoding="UTF-8" ?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd
                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="20170913180000" author="svalero">
        <dropUniqueConstraint constraintName="jhi_user_email_key"
            tableName="jhi_user" />
    </changeSet>
</databaseChangeLog>
<?xml version="1.0" encoding="UTF-8" ?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd
                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="20170913182100" author="svalero">
        <addNotNullConstraint columnDataType="varchar(100)"
            columnName="email"
            tableName="jhi_user"/>
    </changeSet>
</databaseChangeLog>

我还在master.xml上添加了它们,在应用程序上一切都很好地工作了(./gradlew和yarn start)。

但是,当我试图执行集成测试(./gradlew test)时,我在每个测试中都得到了这样的结果:

com.company.name.web.rest.AuditResourceIntTest > getNonExistingAudit FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: liquibase.exception.MigrationFailedException
                Caused by: liquibase.exception.DatabaseException
                    Caused by: org.h2.jdbc.JdbcSQLException

从测试结果中我发现:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [com/company/name/config/DatabaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20170913180000_drop_unique_constraint_email_JhiUser.xml::20170913180000::svalero:
     Reason: liquibase.exception.DatabaseException: Constraint &quot;JHI_USER_EMAIL_KEY&quot; not found; 
     SQL statement: ALTER TABLE PUBLIC.jhi_user DROP CONSTRAINT jhi_user_email_key [90057-196] [Failed SQL: ALTER TABLE PUBLIC.jhi_user DROP CONSTRAINT jhi_user_email_key]
<preConditions onFail="MARK_RAN" onError="MARK_RAN">
    <columnExists columnName="login" tableName="jhi_user" schemaName="public" />
</preConditions>
<preConditions onFail="MARK_RAN" onError="MARK_RAN">
    <sqlCheck expectedResult="1">select count (*) from pg_constraint where conname='jhi_user_email_key'</sqlCheck>
</preConditions>

最后,出了什么问题?为什么测试只运行我的changelogs,而忽略了最初的Changelog?我该怎么解决呢?

共有1个答案

广绪
2023-03-14

与此同时,我在JHipster上创建了一个PR6460,它被合并了,我想它已经消失了,成为下一个版本4.9.1的一部分。惟一约束的名称是ux_user_mail,即您的文件B)20170913180000_drop_unique_constraint_email_jhiuser.xml应更改为:

<代码>.... .....

但是,删除LOGIN列将对登录过程产生影响,即您需要更改UserService类的getUserWithAuthorities方法。

@Transactional(readOnly = true)
public User getUserWithAuthorities() {
    return userRepository.findOneWithAuthoritiesByEmail(SecurityUtils.getCurrentUserLogin()).orElse(null);
}

和DomainUserDetailsService类中的

 @Override
@Transactional
public UserDetails loadUserByUsername(final String login) {
    log.debug("Authenticating {}", login);
    String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
    Optional<User> userFromDatabase = userRepository.findOneWithAuthoritiesByEmail(lowercaseLogin);
    return ........

另外,用户存储库还需要用搜索方法来充实。

@EntityGraph(attributePaths = "authorities")
Optional<User> findOneWithAuthoritiesByEmail(String email);

另一方面,您还需要删除域类用户的登录属性。仅仅删除@Column注释是不够的。即使属性登录在没有@Column注释的类中,hibernate也会使用SchemaManagementException,因为JHipster命名策略是这样配置的

jpa:
    hibernate:
        naming:
            physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
            implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
 类似资料:
  • 我的测试顺序如下: 在这四个测试中,我创建了同一个实体。由于我没有在每个测试用例之后从表中删除记录,因此会得到以下异常: 我想用以下约束条件来解决这个问题: null

  • 我有以下班级档案 当我单独运行这个类时(作为- 控制台输出:[远程测试NG] 检测到测试NG版本 7.0.1 在端口 42250 上启动 Chrome 驱动程序 83.0.4103.39 (ccbf011cb2d2b19b506d833300373761342c20cd-refs/分支头/4103@{#416}) 仅允许本地连接。请参阅 https://chromedriver.chromium.

  • 完成了818个集成测试,0在104001ms运行1个spock测试时失败...失败:CreditServiceSpec groovy.lang.groovyRuntimeException:未能调用构造函数:public org.codehaus.groovy.grails.test.support.grailstestautoWirer(org.springframework.context.a

  • 我有一个maven项目,它有一个名为“BlahITCase”的集成测试。该测试目前失败,进而导致“mvn安装”失败。这是预期的行为吗?我的理解是,单元测试(surefire)失败会导致构建失败,但集成测试(使用故障保护)失败不会。 我在我的pom的构建插件部分有以下内容: 注释出验证目标似乎给了我想要的行为。

  • 我想用liquibase变更集进行模拟数据的集成测试,如何使其不影响真实数据库?我从这里找到了部分想法,但我使用的是springboot,我希望有更简单的解决方案。

  • 我们在webapp中使用liquibase 3.0.8已经有一段时间了,数据库更新是由Spring-liquibase bean在应用程序启动时应用的。我们决定从3.1、3.1.1、3.2.0到3.2.3,逐步更新我们的开发数据库,此时更新失败,出现校验和验证错误。我们尝试恢复到3.2.0,但得到了一组不同的校验和错误。我还尝试从3.0.8直接转到3.4.1(编写时的当前版本),并得到相同的校验和