かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その89 )( Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その88 )( Gradle を 5.3.1 → 6.4 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Spring Boot を 2.1.4 → 2.2.7 へバージョンアップします。
    • 依存関係にあるモジュールも一部を除き最新バージョンにバージョンアップします。

参照したサイト・書籍

目次

  1. Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする
  2. Freemarker のテンプレートの拡張子を *.ftl*.ftlh に変更する
  3. 開発環境で Web アプリを起動する時には -XX:TieredStopAtLevel=1 オプションを指定する
  4. logging.filelogging.file.name に変更する
  5. 最後に build で問題がないか確認する

手順

Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする

以下の方針でバージョンアップします。

  • Spring Boot を 2.1.4 → 2.2.7 にバージョンアップする。
  • Gradle の Plugin も最新バージョンにする。
  • checkstyle, spotbugs, pmd, error-prone は後回し。
  • com.google.guava:guava はバージョンアップするとコンパイル時に警告が出るのでバージョンアップしない。
  • doma 2 の最新バージョンは 2.29.0 ですが domaGen タスクが動作しないため 2.28.0 にする。

build.gradle の以下の点を変更します。

buildscript {
    ext {
        group "ksbysample"
        version "2.2.7-RELEASE"
    }
    repositories {
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.2.7.RELEASE"
    id "io.spring.dependency-management" version "1.0.9.RELEASE"
    id "groovy"
    id "net.ltgt.errorprone" version "0.7.1"
    id "checkstyle"
//    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
    id "com.moowork.node" version "1.3.1"
    id "com.gorylenko.gradle-git-properties" version "2.2.2"
// Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする
//    id "com.github.johnrengelman.processes" version "0.5.0"
    id "com.energizedwork.webdriver-binaries" version "1.4"
}

..........

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }

    // annotationProcessor と testAnnotationProcessor、compileOnly と testCompileOnly を併記不要にする
    testAnnotationProcessor.extendsFrom annotationProcessor
    testImplementation.extendsFrom compileOnly

    // for Doma 2
    domaGenRuntime
}

..........

dependencyManagement {
    imports {
        // mavenBom は以下の URL のものを使用する
        // https://repo.spring.io/release/org/springframework/boot/spring-boot-starter-parent/2.1.4.RELEASE/
        // bomProperty に指定可能な property は以下の URL の BOM に記述がある
        // https://repo.spring.io/release/org/springframework/boot/spring-boot-dependencies/2.1.4.RELEASE/spring-boot-dependencies-2.1.4.RELEASE.pom
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
        mavenBom("org.junit:junit-bom:5.6.2")
    }
}

dependencies {
    def spockVersion = "1.3-groovy-2.5"
    def domaVersion = "2.28.0"
    def lombokVersion = "1.18.12"
    def errorproneVersion = "2.3.3"
    def powermockVersion = "2.0.7"
    def seleniumVersion = "3.141.59"
    def spotbugsVersion = "3.1.11"

    // dependency-management-plugin によりバージョン番号が自動で設定されるもの
    // Appendix F. Dependency versions ( https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/html/appendix-dependency-versions.html ) 参照
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-freemarker")
    implementation("org.springframework.boot:spring-boot-starter-mail")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    runtimeOnly("org.springframework.boot:spring-boot-devtools")
    implementation("org.springframework.session:spring-session-core")
    implementation("org.springframework.session:spring-session-jdbc")
    implementation("org.codehaus.janino:janino")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.yaml:snakeyaml")

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    implementation("com.integralblue:log4jdbc-spring-boot-starter:2.0.0")
    implementation("org.flywaydb:flyway-core:5.2.4")
    implementation("com.h2database:h2:1.4.200")
    implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1")
    implementation("com.google.guava:guava:27.1-jre")
    implementation("org.apache.commons:commons-lang3:3.8.1")
    testImplementation("org.dbunit:dbunit:2.7.0")
    testImplementation("org.assertj:assertj-core:3.16.0")
    testImplementation("org.spockframework:spock-core:${spockVersion}")
    testImplementation("org.spockframework:spock-spring:${spockVersion}")
    testImplementation("org.jsoup:jsoup:1.13.1")
    testImplementation("com.icegreen:greenmail:1.5.13")

    // for lombok
    annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    compileOnly("org.projectlombok:lombok:${lombokVersion}")

    // for Doma
    annotationProcessor("org.seasar.doma:doma:${domaVersion}")
    implementation("org.seasar.doma:doma:${domaVersion}")
    domaGenRuntime("org.seasar.doma:doma-gen:${domaVersion}")
    domaGenRuntime("com.h2database:h2:1.4.200")

    // for Error Prone ( http://errorprone.info/ )
    errorprone("com.google.errorprone:error_prone_core:${errorproneVersion}")
    compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}")

    // PowerMock
    testImplementation("org.powermock:powermock-module-junit4:${powermockVersion}")
    testImplementation("org.powermock:powermock-api-mockito2:${powermockVersion}")

    // for Geb + Spock
    testImplementation("org.gebish:geb-spock:3.4") {
        exclude group: "org.codehaus.groovy", module: "groovy-all"
    }
    testImplementation("org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-support:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-api:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}")

    // for SpotBugs
//    compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}")
//    compileOnly("net.jcip:jcip-annotations:1.0")
//    compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugsVersion}")
//    testImplementation("com.google.code.findbugs:jsr305:3.0.2")

    // for JUnit 5
    // junit-jupiter で junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine の3つが依存関係に追加される
    testCompile("org.junit.jupiter:junit-jupiter")
    testRuntime("org.junit.platform:junit-platform-launcher")
}

..........
  • buildscript block の以下の点を変更します。
    • version "2.1.4-RELEASE"version "2.2.7-RELEASE" に変更します。
    • maven { url "https://plugins.gradle.org/m2/" }gradlePluginPortal() に変更します。
  • plugins block の以下の点を変更します。
    • id "org.springframework.boot"version "2.1.4.RELEASE"version "2.2.7.RELEASE" に変更します。
    • id "io.spring.dependency-management"version "1.0.7.RELEASE"version "1.0.9.RELEASE" に変更します。
    • id "com.gorylenko.gradle-git-properties"version "2.0.0"version "2.2.2" に変更します。
  • configurations block の以下の点を変更します。
    • developmentOnly を追加します。
    • runtimeClasspath { extendsFrom developmentOnly } を追加します。
  • dependencyManagement block の以下の点を変更します。
    • mavenBom("org.junit:junit-bom:5.4.2")mavenBom("org.junit:junit-bom:5.6.2") に変更します。
  • dependencies block の以下の点を変更します。
    • def domaVersion = "2.24.0"def domaVersion = "2.28.0" に変更します。
    • def lombokVersion = "1.18.6"def lombokVersion = "1.18.12" に変更します。
    • def powermockVersion = "2.0.0"def powermockVersion = "2.0.7" に変更します。
    • implementation("com.integralblue:log4jdbc-spring-boot-starter:1.0.2")implementation("com.integralblue:log4jdbc-spring-boot-starter:2.0.0") に変更します。
    • implementation("org.flywaydb:flyway-core:5.2.4")implementation("org.flywaydb:flyway-core:6.4.1") に変更します。
    • implementation("com.h2database:h2:1.4.192")implementation("com.h2database:h2:1.4.200") に変更します。
    • implementation("com.github.rozidan:modelmapper-spring-boot-starter:1.0.0")implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1") に変更します。
    • implementation("org.apache.commons:commons-lang3:3.8.1")implementation("org.apache.commons:commons-lang3:3.10") に変更します。
    • testImplementation("org.dbunit:dbunit:2.6.0")testImplementation("org.dbunit:dbunit:2.7.0") に変更します。
    • testImplementation("org.assertj:assertj-core:3.12.2")testImplementation("org.assertj:assertj-core:3.16.0") に変更します。
    • testImplementation("org.jsoup:jsoup:1.11.3")testImplementation("org.jsoup:jsoup:1.13.1") に変更します。
    • testImplementation("com.icegreen:greenmail:1.5.10")testImplementation("com.icegreen:greenmail:1.5.13") に変更します。
    • domaGenRuntime("com.h2database:h2:1.4.192")domaGenRuntime("com.h2database:h2:1.4.200") に変更します。

変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、特にエラーは出ずに更新されました。

clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると、テストが 13件失敗しました。

f:id:ksby:20200509130021p:plain

エラーメッセージは全て org.h2.jdbc.JdbcSQLException at InquiryTestSpec.groovy:29 Caused by: java.net.SocketTimeoutException at InquiryTestSpec.groovy:29 で、原因は build タスクでは実行されないようにしていた Geb のテストが JUnit 5 のテストを実行するように設定していたはずの test タスクで実行されていたからでした。

build.gradle の test タスクに exclude "geb/**" を追加して Geb のテストが除外されるようにします。

test {
    // test タスクの jvmArgs は tasks.withType(Test) { ... } で定義している
    exclude "geb/**"

    // for JUnit 5
    useJUnitPlatform()

    testLogging {
        afterSuite printTestCount
    }
}

再度 clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると今度は BUILD SUCCESSFUL が表示されました。

f:id:ksby:20200509131800p:plain

Freemarker のテンプレートの拡張子を *.ftl*.ftlh に変更する

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その5 )( Release Notes を見て必要な箇所を変更する ) で変更した内容を boot-npm-geb-sample にも反映します。

以下のファイルの拡張子を *.ftl*.ftlh に変更します。

src/main/resources/templates/mail/inquirymail-body.ftlh

開発環境で Web アプリを起動する時には -XX:TieredStopAtLevel=1 オプションを指定する

build.gradle の bootRun タスクに "-XX:TieredStopAtLevel=1" を追加します。

bootRun {
    jvmArgs = jvmArgsForTask +
            jvmArgsAddOpens +
            [
                    "-Dspring.profiles.active=develop",
                    "-XX:TieredStopAtLevel=1"
            ]
}

logging.filelogging.file.name に変更する

src/main/resources/application-product.properties 内の設定を logging.file → logging.file.name に変更します。

server.tomcat.basedir=C:/webapps/boot-npm-geb-sample
logging.file.name=${server.tomcat.basedir}/logs/boot-npm-geb-sample.log

最後に build で問題がないか確認する

clean タスク実行 → Rebuild Project 実行 → build タスク実行をすると BUILD SUCCESSFUL が表示されます(と思いましたが testJUnit4AndSpock と test タスクのどちらも 147 tests になっていました、次の回で解消します)。

f:id:ksby:20200509160327p:plain

Web アプリを起動してから gebTest タスクを実行するとこちらも BUILD SUCCESSFUL が表示されます。

f:id:ksby:20200509161041p:plain

履歴

2020/05/10
初版発行。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その88 )( Gradle を 5.3.1 → 6.4 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その87 )( postcss-cli を 6.1.2 → 7.1.1 へ、prettier を 1.16.4 → 2.0.5 へ、stylelint を 9.10.1 → 13.3.3 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Gradle を 5.3.1 → 6.4 へバージョンアップします。

参照したサイト・書籍

目次

  1. .gitignore に /src/main/generated、/src/test/generated_tests を追加する
  2. Gradle を 5.3.1 → 6.4 へバージョンアップする

手順

.gitignore に /src/main/generated、/src/test/generated_tests を追加する

IntelliJ IDEA を 2019.3 以降にバージョンアップすると generated ディレクトリを作成するようになるので、.gitignore に /src/main/generated、/src/test/generated_tests を追加してその下に作成されるファイルを git の対象外になるようにします。

..........

# Intellij project files
*.iml
*.ipr
*.iws
**/.idea/
**/out/
**/src/main/resources/static
**/src/main/generated
**/src/test/generated_tests

..........

Gradle を 5.3.1 → 6.4 へバージョンアップする

build.gradle の wrapper タスクの記述を以下のように変更します。

wrapper {
    gradleVersion = "6.4"
    distributionType = Wrapper.DistributionType.ALL
}
  • gradleVersion = "5.3.1"gradleVersion = "6.4" に変更します。

コマンドプロンプトから gradlew wrapper --gradle-version=6.4gradlew --version コマンドを実行します。

f:id:ksby:20200508010358p:plain

gradle/wrapper/gradle-wrapper.properties は以下の内容になります。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

JVM を呼び出す時のメモリ割り当ての記述が元に戻るので、gradlew.bat 内の記述を set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" → set DEFAULT_JVM_OPTS="-Xmx4096m" に変更します(gradlew も同じような変更をします)。

Gradle を 6 系に上げただけだと SpotBugs のタスクが動作しなくなるので(バージョンアップが必要)、一旦 SpotBugs をコメントアウトします。build.gradle を以下のように変更します。

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.1.4.RELEASE"
    id "io.spring.dependency-management" version "1.0.7.RELEASE"
    id "groovy"
    id "net.ltgt.errorprone" version "0.7.1"
    id "checkstyle"
//    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
    id "com.moowork.node" version "1.3.1"
    id "com.gorylenko.gradle-git-properties" version "2.0.0"
// Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする
//    id "com.github.johnrengelman.processes" version "0.5.0"
    id "com.energizedwork.webdriver-binaries" version "1.4"
}

..........

//spotbugs {
//    // SpotBugs のレポートファイルは Firefox で見ると文字化けしない
//    toolVersion = "3.1.11"
//    ignoreFailures = true
//    effort = "max"
//    excludeFilter = file("${rootProject.projectDir}/config/spotbugs/spotbugs-exclude-filter.xml")
//    spotbugsTest.enabled = false
//}
//tasks.withType(com.github.spotbugs.SpotBugsTask) {
//    reports {
//        xml.enabled = false
//        html.enabled = true
//    }
//}

..........

dependencies {
    ..........

    // for SpotBugs
//    compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}")
//    compileOnly("net.jcip:jcip-annotations:1.0")
//    compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugsVersion}")
//    testImplementation("com.google.code.findbugs:jsr305:3.0.2")

    ..........
}

Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると Doma 2 関連のエラーが出ました。build.gradle の記述の仕方が古いのが原因です。

f:id:ksby:20200508012359p:plain

build.gradle を以下のように変更します。

..........

// for Doma 2
// Copy the resources referred by the Doma annotation processors to
// the destinationDir of the compileJava task
task copyDomaResources(type: Sync) {
    from sourceSets.main.resources.srcDirs
    into compileJava.destinationDir
    include "doma.compile.config"
    include "META-INF/**/*.sql"
    include "META-INF/**/*.script"
}
compileJava.dependsOn copyDomaResources

springBoot {
    buildInfo()
}

..........
  • 以下の2行を削除します。
    • processResources.destinationDir = compileJava.destinationDir
    • compileJava.dependsOn processResources
  • 以下の設定を追加します。
    • task copyDomaResources(type: Sync) { ... }
    • compileJava.dependsOn copyDomaResources

再度 build タスクを実行すると今度は pmdMain でエラーが出ました。

f:id:ksby:20200509005659p:plain

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その2 )( Spring Boot を 2.1.4 → 2.1.11 へ、Gradle を 5.3.1 → 5.6.4 へバージョンアップする ) で以下の赤枠の記述を削除していたので、今回も同様に削除します。

f:id:ksby:20200509005813p:plain

再度 build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。

f:id:ksby:20200509011146p:plain

履歴

2020/05/09
初版発行。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その87 )( postcss-cli を 6.1.2 → 7.1.1 へ、prettier を 1.16.4 → 2.0.5 へ、stylelint を 9.10.1 → 13.3.3 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その86 )( eslint を 5.16.0 → 6.8.0 へ、jest を 24.7.1 → 26.0.1 へバージョンアップし、windows-build-tools を 5.1.0 → 4.0.0 へバージョンダウンする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • postcss-cli を 6.1.2 → 7.1.1 へ、prettier を 1.16.4 → 2.0.5 へ、stylelint を 9.10.1 → 13.3.3 へバージョンアップします。

参照したサイト・書籍

  1. Prettier 2.0 “2020”
    https://prettier.io/blog/2020/03/21/2.0.0.html

  2. Prettier 2.0 の主要な変更
    https://qiita.com/sosukesuzuki/items/50a5ed5e7079eb9da0fe

目次

  1. postcss-cli を 6.1.2 → 7.1.1 へバージョンアップする
  2. prettier を 1.16.4 → 2.0.5 へバージョンアップする
  3. stylelint を 9.10.1 → 13.3.3 へバージョンアップする
  4. 最後に各種コマンドや build で問題がないか確認する

手順

postcss-cli を 6.1.2 → 7.1.1 へバージョンアップする

以下のコマンドを実行します。

  • npm install --save-dev postcss-cli@7.1.1

npm testnpm run build コマンドを実行すると特にエラーが出ずに終了しました(キャプチャは npm run build のみ)。

f:id:ksby:20200506230357p:plain

Web アプリを起動して画面が正常に表示されていることも確認します(キャプチャは省略)。

prettier を 1.16.4 → 2.0.5 へバージョンアップする

以下のコマンドを実行します。

  • npm install --save-dev prettier@2.0.5

npm test コマンドを実行するとテストは全て成功しました。

f:id:ksby:20200506231311p:plain

npm test コマンド実行時には prettier:formatprettier:format-test の npm scripts が実行されて prettier によるフォーマットが行われるようにしていますが、今回は全部の js ファイルがフォーマットされていました。以下の内容でした。

  • function()function () と括弧の前にスペースが入るようになった。
  • 配列の最後の要素の後にカンマが追加されるようになった。
  • ファイルの改行コードを CRLF にしていたが LF に変更された。

Prettier 2 の変更点は Prettier 2.0 “2020” に記載されています。

npm run build コマンドを実行すると大量の xpected linebreaks to be 'CRLF' but found 'LF' のエラーメッセージが出力されました。

f:id:ksby:20200506233005p:plain

このエラーを解消するために .eslintrc.js を以下のように変更します。

module.exports = {
  extends: ["airbnb-base/legacy", "plugin:prettier/recommended"],
  env: {
    jquery: true
  },
  rules: {
    // requires to declare all vars on top of their containing scope
    "vars-on-top": "off",

    // require function expressions to have a name
    // http://eslint.org/docs/rules/func-names
    "func-names": "off",

    // disallow mixed 'LF' and 'CRLF' as linebreaks
    // http://eslint.org/docs/rules/linebreak-style
    "linebreak-style": ["error", "unix"],

    // specify whether double or single quotes should be used
    quotes: ["error", "double", {avoidEscape: true}],

    // disallow use of variables before they are defined
    "no-use-before-define": [
      "error",
      {functions: false, classes: true, variables: true}
    ]
  }
};
  • "linebreak-style": ["error", "windows"],"linebreak-style": ["error", "unix"], に変更します。

再び npm run build コマンドを実行すると今度は特にエラーが出ずに終了しました。

f:id:ksby:20200506233744p:plain

.js ファイルの改行コードが LF になるので .gitattributes を新規作成して以下の内容を記述します。

*           text=auto
*.js        text eol=lf

また IntelliJ IDEA の Settings ダイアログを開き Languages & Frameworks -> JavaScript -> Code Quality Tools -> ESLint に移動して「Node interpreter」を 12.16.3 に変更します。

f:id:ksby:20200506234742p:plain

stylelint を 9.10.1 → 13.3.3 へバージョンアップする

以下のコマンドを実行します。

  • npm install --save-dev stylelint@13.3.3
  • npm install --save-dev stylelint-config-standard@20.0.0

IntelliJ IDEA の Settings ダイアログを開き Languages & Frameworks -> Style Sheets -> Stylelint に移動して「Enable」をチェックし「Stylelint package」を 13.3.3 に変更します。

f:id:ksby:20200507000615p:plain

npm testnpm run build コマンドを実行すると npm run build の時に2種類のメッセージが出力されました。

f:id:ksby:20200507233232p:plain f:id:ksby:20200507233358p:plain

  • Unexpected empty line before rule (rule-empty-line-before)
  • Unexpected empty line before at-rule (at-rule-empty-line-before)

メッセージが出ないようにするために stylelint.config.js を以下のように変更します。

"use strict";

module.exports = {
  extends: "stylelint-config-standard",
  rules: {
    "comment-empty-line-before": [
      "always",
      {
        ignore: ["after-comment"],
      },
    ],
    indentation: 4,
    "number-leading-zero": "never",
  },
};
  • ファイルの先頭に "use strict"; を追加します(module.exports の module の部分に赤波線が表示されていたため)。
  • "at-rule-empty-line-before": [ ... ] を削除します。
  • "rule-empty-line-before": "never-multi-line", を削除します。

再度 npm run build を実行すると今度はメッセージが出ませんでした。

f:id:ksby:20200507234316p:plain

最後に各種コマンドや build で問題がないか確認する

最後にコマンド、build で問題がないか一通り確認します。

npm test コマンドは問題ありませんでした。。。と思っていましたが、前からずっと A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --runInBand --detectOpenHandles to find leaks. のメッセージが出ていました。

f:id:ksby:20200507235017p:plain (.....途中省略.....) f:id:ksby:20200507235535p:plain

package.json を以下のように変更します。

  "scripts": {
    "test": "run-s prettier:format prettier:format-test jest",
    "jest": "jest --config=jest.config.json --coverage --runInBand --detectOpenHandles",
    "postinstall": "run-s clean:static-dir copy:all",
    ..........
  • jest タスクの末尾に --runInBand --detectOpenHandles を追加します。

再度 npm test コマンドを実行すると今度はメッセージが表示されなくなりました。ただし終了前に少し待つようにもなりました。気にはなりますが、このまま進めることにします。

f:id:ksby:20200508000718p:plain

npm run build コマンドも問題ありません。

f:id:ksby:20200508001637p:plain

clean タスク実行 → Rebuild Project 実行 → build タスク実行も問題ありません。

f:id:ksby:20200508002243p:plain

gebTest タスクも問題ありませんでした。

f:id:ksby:20200508003333p:plain

IntelliJ IDEA の「Settings」ダイアログを開いて「Language & Frameworks」-「Node.js and NPM」を表示し、バージョンアップ後の状態も記載しておきます。

f:id:ksby:20200508003549p:plain f:id:ksby:20200508003630p:plain

履歴

2020/05/08
初版発行。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その86 )( eslint を 5.16.0 → 6.8.0 へ、jest を 24.7.1 → 26.0.1 へバージョンアップし、windows-build-tools を 5.1.0 → 4.0.0 へバージョンダウンする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その85 )( Node.js を 10.15.3 → 12.16.3 へ、npm を 6.9.0 → 6.14.5 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • eslint を 5.16.0 → 6.8.0 へ、jest を 24.7.1 → 26.0.1 へバージョンアップします。
    • windows-build-tools を 5.1.0 → 5.2.2 へバージョンアップしようとしたのですがエラーメッセージが表示されてインストール出来ず、5.1.0 にも戻せなかったので、4.0.0 へバージョンダウンしました。

参照したサイト・書籍

  1. eslint-config-airbnb-base
    https://www.npmjs.com/package/eslint-config-airbnb-base

目次

  1. eslint を 5.16.0 → 6.8.0 へ、eslint-config-airbnb-base を 13.1.0 → 14.1.0 へバージョンアップする
  2. windows-build-tools を 5.1.0 → 5.2.2 へバージョンアップする。。。つもりが 4.0.0 へバージョンダウンする
  3. jest を 24.7.1 → 26.0.1 へバージョンアップする

手順

eslint を 5.16.0 → 6.8.0 へ、eslint-config-airbnb-base を 13.1.0 → 14.1.0 へバージョンアップする

以下のコマンドを実行して eslint 関連のモジュールを最新のバージョンにします。

  • npm install --save-dev eslint@6.8.0
  • npm install --save-dev eslint-config-prettier@6.11.0
  • npm install --save-dev eslint-loader@4.0.2
  • npm install --save-dev eslint-plugin-import@2.20.1
  • npm install --save-dev eslint-plugin-prettier@3.1.3
    ※acorn は1つ前の回でバージョンアップしてしまいました。

以下のコマンドを実行して eslint-config-airbnb-base を 14.1.0 へバージョンアップします。

  • npm info "eslint-config-airbnb-base@14.1.0" peerDependencies
  • npx install-peerdeps --dev eslint-config-airbnb-base@14.1.0

f:id:ksby:20200506171531p:plain

npm test コマンドを実行するとテストは全て成功しましたが、

f:id:ksby:20200506171829p:plain

npm run build コマンドは Use the global form of 'use strict' のエラーメッセージが出て処理が中断しました。

f:id:ksby:20200506172052p:plain f:id:ksby:20200506172137p:plain

src/main/assets/js/inquiry/confirm.js を見ると "use strict"; の記述がなかったのでファイルの最初に追加します。

"use strict";

$(document).ready(function() {
    ..........

再度 npm testnpm run build を実行すると今度は特にエラーが出ずに終了しました。

f:id:ksby:20200506191152p:plain

windows-build-tools を 5.1.0 → 5.2.2 へバージョンアップする。。。つもりが 4.0.0 へバージョンダウンする

管理者モードで Powershell を起動した後、以下のコマンドを実行します。。。が Could not install Visual Studio Build Tools. のメッセージが表示されており、どうもインストール出来ていないようです(今回は ConEmu を管理者モードで起動した後 PowerShell -ExecutionPolicy RemoteSigned コマンドで PowerShell に切り替えて実行しています)。

  • npm uninstall --global windows-build-tools
  • npm install --global windows-build-tools@5.2.2

f:id:ksby:20200506194732p:plain f:id:ksby:20200506195027p:plain

Web で検索したところ Could not install Visual Studio Build Tools を見つけましたが、C:\Users\root\.windows-build-tools を削除しても同じメッセージが表示されます。

解決方法が分からないので 5.1.0 へ戻そうとしましたが同じエラーメッセージが出て元に戻せません。。。 どうも Windows 10 のバージョンが上がった影響でインストール出来なくなっているように思えます。

仕方がないので 4.0.0 をインストールしてみたところ、無事インストール出来ました。このバージョンを使うことにします。

  • npm uninstall --global windows-build-tools
  • npm install --global windows-build-tools@4.0.0

f:id:ksby:20200506202950p:plain

jest を 24.7.1 → 26.0.1 へバージョンアップする

以下のコマンドを実行します。

  • npm install --save-dev jest@26.0.1
  • npm install --save-dev jest-html-reporter@3.1.0

レポートファイルを削除したいので最初に gradle から clean タスクを実行しておきます。npm test コマンドを実行するとテストは全て成功しました。

f:id:ksby:20200506221429p:plain

レポートファイルは build/reports/jest/jest-html-reporter.html に生成されているのですが、テスト結果が出力されていませんでした。。。

f:id:ksby:20200506221806p:plain

https://www.npmjs.com/package/jest-html-reporter を見ると設定方法が変わっていたので、jest.config.json を以下のように変更します。

{
  "coverageDirectory": "build/reports/jest",
  "moduleDirectories": [
    "node_modules",
    "src/main/assets/js"
  ],
  "reporters": [
    "default",
    [
      "./node_modules/jest-html-reporter",
      {
        "pageTitle": "Test Report"
      }
    ]
  ]
}
  • "testResultsProcessor": "./node_modules/jest-html-reporter"reporters": ["default", ["./node_modules/jest-html-reporter", {"pageTitle": "Test Report"}] に変更します。

再度 npm test コマンドを実行するとテストが成功して build/reports/jest/jest-html-reporter.html にレポートが出力されていました。

f:id:ksby:20200506222751p:plain

履歴

2020/05/06
初版発行。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その85 )( Node.js を 10.15.3 → 12.16.3 へ、npm を 6.9.0 → 6.14.5 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その84 )( WebDriver を最新バージョンに上げる ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Node.js を 10.15.3 → 12.16.3 へ、npm を 6.9.0 → 6.14.5 へバージョンアップします。
    • また npm でインストールしているモジュールを一部を除き最新のバージョンにします。

参照したサイト・書籍

  1. chimurai / http-proxy-middleware
    https://github.com/chimurai/http-proxy-middleware

目次

  1. まずは現在の状況を確認する
  2. nodist は 0.9.1 のまま
  3. Node.js を 12.16.3 へ、npm を 6.14.5 へバージョンアップする
  4. モジュールを最新のバージョンにする
  5. Replace Autoprefixer browsers option to Browserslist config. のメッセージが表示されないようにする

手順

まずは現在の状況を確認する

現在のバージョンは nodist が 0.9.1、Node.js が 10.15.3、npm が 6.9.0 です。

f:id:ksby:20200506103301p:plain

nodist は 0.9.1 のまま

https://github.com/nullivex/nodist/releases を見ると nodist の最新バージョンは 0.9.1 のままでした。更新が止まっている?と思って最近の Windows の Node.js バージョン管理ツールを調べてみましたが、

  • Windows の Node.js バージョン管理ツールは nodistnvm-windows がある。
  • nodist の最新バージョンは 0.9.1、リリース日は 30 Mar 2019。
  • nvm-windows の最新バージョンは 1.1.7 - Maintenance Release、リリース日は 2 Aug 2018。
  • nodist のリリースが止まっているので nvm-windows に変更したという記事を見かけたが、
    • nodist は 0.8.8(17 Dec 2016 リリース)でリリースが止まっていたが @nullivex さんがメンテナンスするようになり 0.9.x が 28 Mar 2019 からリリースされている。
    • nvm-windows の最新バージョンが 1.1.7 - Maintenance Release(2 Aug 2018 リリース)なので nodist の方がメンテナンスされている模様。

という状況でしたので、nodist の 0.9.1 を引き続き使用します。

Node.js を 12.16.3 へ、npm を 6.14.5 へバージョンアップする

https://nodejs.org/ja/ を見ると Node.js の推奨版は 12.16.3 LTS でした。

f:id:ksby:20200506110146p:plain

Node.js を 12.16.3 にバージョンアップします。

f:id:ksby:20200506110407p:plain

npm の最新バージョンは https://github.com/npm/cli/releases を見ると 6.14.5 でした。

f:id:ksby:20200506110633p:plain

6.14.5 にバージョンアップします。。。が、nodist npm global 6.14.5 を実行するとなぜかファイルを最後までダウンロードできません。

f:id:ksby:20200506112403p:plain

ブラウザから https://codeload.github.com/npm/cli/tar.gz/v6.14.5 にアクセスして cli-6.14.5.tar.gz をダウンロード・解凍した後、D:\Nodist\npmv\6.14.5 にコピーします。

f:id:ksby:20200506112648p:plain

残りのコマンドを実行します。手動でファイルをダウンロードしたので nodist npm 6.14.5 を実行する必要がありました。またプロジェクト直下に node-tar-extract フォルダが作成されていたので削除しました。

f:id:ksby:20200506113252p:plain

モジュールを最新のバージョンにする

バージョンアップ可能なモジュールを確認します。IntelliJ IDEA のメインメニューから「File」-「Settings...」を選択して「Settings」ダイアログを開き、画面左側で「Language & Frameworks」-「Node.js and NPM」を選択します。

画面右側にモジュールの一覧と現行バージョン、最新バージョン一覧が表示されます。

f:id:ksby:20200506114056p:plain f:id:ksby:20200506114129p:plain

今回は以下の方針でバージョンアップします。

  • admin-lte、bootstrap、ionicons は現行のまま。
  • mobx、mobx-utils は少し触ってみただけなのでバージョンアップしない。
  • eslint、jest + widows-build-tools、postcss-cli、prettier、stylelint + stylelint-config-standard は別に章を分けてバージョンアップする。
  • バージョンアップは npm update ではなく npm install --save-dev autoprefixer@8.0.0(package.json の dependencies に記載されているものは --save、devDependencies に記載されているものは --save-dev にする) のようにバージョンを指定しながらバージョンアップする。
  • 1つずつ上からバージョンアップする。関連しそうなところを動作確認しながら進める。
  • @vue/cli は boot-npm-geb-sample プロジェクトでは使用していないので、ここではバージョンアップしない。

特に問題がでなければ画面キャプチャは撮りません。

  • npm install --save-dev acorn@7.1.1
  • npm install --save-dev autoprefixer@9.7.6
  • npm install --save-dev axios@0.19.2
  • npm install --save-dev browser-sync@2.26.7
  • npm install --save-dev http-proxy-middleware@1.0.3
  • npm install --save-dev jquery@3.5.1
  • npm install --save-dev jquery-mockjax@2.5.1
  • npm install --save-dev nock@12.0.3
  • npm install --save-dev rimraf@3.0.2
  • npm install --save-dev uglifyjs-webpack-plugin@2.2.0
  • npm install --save-dev webpack@4.43.0
  • npm install --save-dev webpack-cli@3.3.11
  • npm install --save-dev xhr-mock@2.5.1

npm install コマンドを実行してから(npm scripts の postinstall の処理を実行するため) npm test コマンドを実行すると全てのテストが成功しました。

f:id:ksby:20200506133108p:plain

npm run build コマンドは終了はしましたが、Replace Autoprefixer browsers option to Browserslist config. ... というメッセージが表示されました。

f:id:ksby:20200506133341p:plain

最後に表示されていた Browserslist: caniuse-lite is outdated. Please run next command npm update を Web で検索すると https://github.com/postcss/autoprefixer/issues/1184 が見つかりました。npx browserslist@latest --update-db を実行します。

f:id:ksby:20200506134739p:plain

コマンド実行後は Replace Autoprefixer browsers option to Browserslist config. ... というメッセージは消えませんでしたが、Browserslist: caniuse-lite is outdated. Please run next command npm update のメッセージは表示されなくなりました。

clean タスク実行 → Rebuild Project 実行 → build タスク実行は問題なく BUILD SUCCESSFUL のメッセージが出力されて成功し、

f:id:ksby:20200506140029p:plain

gebTest タスクも BUILD SUCCESSFUL のメッセージが出力されて成功しました。

f:id:ksby:20200506140755p:plain

今回は browser-sync と http-proxy-middleware をバージョンアップしたので npm run springboot で起動してみましたが、TypeError: httpProxyMiddleware is not a function というメッセージが表示されて起動しませんでした。

f:id:ksby:20200506161026p:plain

https://github.com/chimurai/http-proxy-middleware を見ると const { createProxyMiddleware } = require('http-proxy-middleware'); という書き方に変わっていたので、bs-springboot-config.js を以下のように変更します。

const {createProxyMiddleware} = require("http-proxy-middleware");
const proxy = createProxyMiddleware(
  [
    // /css, /js, /vendor と *.html は Tomcat に転送しない
    "!/css/**/*",
    "!/js/**/*",
    "!/vendor/**/*",
    "!/**/*.html",
    "/**/*"
  ],
  {target: "http://localhost:8080"}
);

..........
  • var httpProxyMiddleware = require("http-proxy-middleware");const {createProxyMiddleware} = require("http-proxy-middleware"); に変更します。
  • var proxy = httpProxyMiddleware(const proxy = createProxyMiddleware( に変更します。

npm run springboot を実行すると今度は browser-sync が起動しました。Web アプリを起動してブラウザから画面へのアクセスしても問題ありませんでした。

f:id:ksby:20200506161753p:plain f:id:ksby:20200506161845p:plain

Replace Autoprefixer browsers option to Browserslist config. のメッセージが表示されないようにする

browsers の設定項目があるファイルがあるか検索したところ postcss.config.js の中に browsers: ["last 2 versions"] という記述がありました。これが原因と思われるので以下のように変更します。

module.exports = {
  plugins: [
    require("stylelint"),
    require("autoprefixer")({
      browserlist: ["last 2 versions"]
    }),
    require("cssnano")({
      preset: "default"
    })
  ]
};
  • browsers: ["last 2 versions"]browserlist: ["last 2 versions"] に変更します。

npm run build コマンド実行時に Replace Autoprefixer browsers option to Browserslist config. のメッセージが表示されなくなり、

f:id:ksby:20200506163229p:plain

npm run springboot コマンド実行時にもメッセージが表示されなくなりました。

f:id:ksby:20200506163446p:plain f:id:ksby:20200506163558p:plain

履歴

2020/05/06
初版発行。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その84 )( WebDriver を最新バージョンに上げる )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その83 )( Checkstyle を 8.11 → 8.19 へ、PMD を 6.6.0 → 6.13.0 へバージョンアップ+JUnit 5 の導入+ Oracle JDK 8u202 → AdoptOpenJDK 11.0.2+9 へ、error-prone を 2.3.1 → 2.3.3 へバージョンアップする ) の続きです。

何回かに分けて boot-npm-geb-sample プロジェクトのモジュールやツールを 2020/05 時点の最新バージョンにします。IntelliJ IDEA は 2020.1.1、JDK は AdoptOpenJDK 11.0.7+10.2 を使用します。

  • 今回の手順で確認できるのは以下の内容です。
    • WebDriver を最新バージョンに上げて動作するようにします。

参照したサイト・書籍

目次

  1. WebDriver のバージョンを最新にする
  2. build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する
  3. Selenium と Geb を最新バージョンにする
  4. 結局テストが成功するようになったのは sleep(500) でした。。。
  5. gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred が出ているのを解消する

手順

WebDriver のバージョンを最新にする

動作確認をする前に ChromeFirefox のWebDriver を最新バージョンにします。Chrome の WebDriver は https://chromedriver.chromium.org/ を見ると Current stable release は 81.0.4044.69、Firefox の WebDriver は https://github.com/mozilla/geckodriver/releases を見ると 0.26.0 でした。

build.gradle の以下の点を変更します。

webdriverBinaries {
    chromedriver "81.0.4044.69"
    geckodriver "0.26.0"
}
  • chromedriver "73.0.3683.68"chromedriver "81.0.4044.69" に変更します。
  • geckodriver "0.24.0"geckodriver "0.26.0" に変更します。

変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

また chromedriver、geckodriver の exe もダウンロードして D:\chromedriver\81.0.4044.69D:\geckodriver\0.26.0 の下に配置した後、src/test/resources/GebConfig.groovy の以下の点を変更します。

//System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.24.0/geckodriver.bat")
//System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe")
driver = {
    ..........
  • D:/geckodriver/0.24.0/geckodriver.batD:/geckodriver/0.26.0/geckodriver.bat に変更します。
  • D:/chromedriver/73.0.3683.68/chromedriver.exeD:/chromedriver/81.0.4044.69/chromedriver.exe に変更します。

build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する

clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと compileTestGroovy タスクで警告のメッセージが出ますが、BUILD SUCCESSFUL のメッセージが表示されます。Spring Boot + npm + Geb で入力フォームを作ってテストする ( その83 )( Checkstyle を 8.11 → 8.19 へ、PMD を 6.6.0 → 6.13.0 へバージョンアップ+JUnit 5 の導入+ Oracle JDK 8u202 → AdoptOpenJDK 11.0.2+9 へ、error-prone を 2.3.1 → 2.3.3 へバージョンアップする) と同じ状況ですので、これは OK。

f:id:ksby:20200505235710p:plain

Web アプリを起動してから gebTest タスクを実行してみると、こちらも BUILD SUCCESSFUL のメッセージが表示されました。

f:id:ksby:20200506002007p:plain

次は IDEA から Geb のテストを実行してみます。src/test/resources/GebConfig.groovy の上に記述している WebDriver のパスの設定のコメントを解除してから、

System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.26.0/geckodriver.bat")
System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe")
driver = {
    ChromeOptions chromeOptions = new ChromeOptions()
    new ChromeDriver(chromeOptions)
//    FirefoxOptions firefoxOptions = new FirefoxOptions()
//    new FirefoxDriver(firefoxOptions)
}

src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy を開いてテストを実行します。

f:id:ksby:20200506002752p:plain

Chrome は一部のテストが失敗しました。動きを見ていると画面遷移時にカーソルが正しい入力項目に移動しないように見えます。Headless モードでは成功するのに。。。

f:id:ksby:20200506002532p:plain

Firefox に切り替えてテストを実行すると、

System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.26.0/geckodriver.bat")
System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe")
driver = {
//    ChromeOptions chromeOptions = new ChromeOptions()
//    new ChromeDriver(chromeOptions)
    FirefoxOptions firefoxOptions = new FirefoxOptions()
    new FirefoxDriver(firefoxOptions)
}

こちらはすべてのテストが成功しました。

f:id:ksby:20200506003410p:plain

SeleniumGeb を最新バージョンにする

Headless モードでない Chrome でテストが失敗する原因が分からないため、SeleniumGeb を最新バージョンにしてみます。

build.gradle の dependencies block の以下の点を変更します。

dependencies {
    ..........
    def seleniumVersion = "3.141.59"
    ..........

    ..........

    // for Geb + Spock
    testImplementation("org.gebish:geb-spock:3.4") {
        exclude group: "org.codehaus.groovy", module: "groovy-all"
    }
    testImplementation("org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-support:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-api:${seleniumVersion}")
    testImplementation("org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}")

    ..........
}
  • def seleniumVersion = "3.13.0"def seleniumVersion = "3.141.59" に変更します。
  • testImplementation("org.gebish:geb-spock:2.3.1")testImplementation("org.gebish:geb-spock:3.4") に変更します。

変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

起動している Web アプリを停止してから build し直した後、再度 Web アプリを起動します。

src/test/resources/GebConfig.groovy の設定を Chrome に切り替えてから src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy のテストを実行してみましたが、状況は変わりませんでした。。。

f:id:ksby:20200506010034p:plain

結局テストが成功するようになったのは sleep(500) でした。。。

Web で検索してみたところ以下のページを見つけて document.readyState や jQuery.active の状態を見るようにしてみましたが、状況は変わりません。

結局いろいろ試してみた結果、テストが成功するようになったのは form.btnXxxx.click(...) の後に sleep(500) を追加した場合でした。src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy を以下のように変更します(全てのテストを同様に変更します)。

    def "入力画面1に入力後、入力画面2へ遷移→入力画面1へ戻ると入力した値が表示される"() {
        given: "入力画面1を表示する"
        to InquiryInput01Page

        when: "最大文字数の文字を入力して次へボタンをクリックする"
        form.setValueList(maxLengthValueList)
        form.btnNext.click(InquiryInput02Page)
        sleep(500)

        then: "入力画面2へ遷移し初期値が表示されている"
        form.assertValueList(initialValueList)

        and: "戻るボタンをクリックする"
        form.btnBack.click(InquiryInput01Page)
        sleep(500)

        then: "入力した最大文字数の文字が入力されている"
        form.assertValueList(maxLengthValueList)
    }

f:id:ksby:20200506011724p:plain

もっと適切な修正方法があるとは思うのですが、さっぱり分かりませんでした。。。

gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred が出ているのを解消する

SeleniumGeb を最新バージョンにしたら gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred が出るようになっていましたので、出ないようにします。

f:id:ksby:20200506094635p:plain

to method が出力されている行(例えば WARNING: Illegal reflective access by ... to method java.util.function.Predicate.... )のパッケージ名を見て build.gradle の以下の点を変更します。

// JDK 11 に変更後、test タスク実行時に groovy と powermock が JDKの内部部分にアクセスするためにコードでリフレクションを使用
// していて WARNING が出るため、JVM の起動時オプションの --add-opens を指定して WARNING が出ないようにする
def jvmArgsAddOpens = [
        "--add-opens=java.base/java.io=ALL-UNNAMED",
        "--add-opens=java.base/java.lang=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.ref=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
        "--add-opens=java.base/java.math=ALL-UNNAMED",
        "--add-opens=java.base/java.net=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.charset=ALL-UNNAMED",
        "--add-opens=java.base/java.security=ALL-UNNAMED",
        "--add-opens=java.base/java.time=ALL-UNNAMED",
        "--add-opens=java.base/java.util=ALL-UNNAMED",
        "--add-opens=java.base/java.util.function=ALL-UNNAMED",
        "--add-opens=java.base/java.util.regex=ALL-UNNAMED",
        "--add-opens=java.base/java.util.stream=ALL-UNNAMED",
        "--add-opens=java.desktop/java.beans=ALL-UNNAMED"
]

..........
  • jvmArgsAddOpens に以下のオプションを追加します。
    • "--add-opens=java.base/java.math=ALL-UNNAMED"
    • "--add-opens=java.base/java.time=ALL-UNNAMED"
    • "--add-opens=java.base/java.util.function=ALL-UNNAMED"

gebTest タスクを実行して WARNING: An illegal reflective access operation has occurred が出なくなったことを確認します。

f:id:ksby:20200506095507p:plain

履歴

2020/05/06
初版発行。

IntelliJ IDEA 2020.1 新機能メモ書き(といいつつ既存機能を初めて知ったりもする)

概要

記事一覧はこちらです。

IntelliJ IDEA 2020.1 にバージョンアップしたので新機能を確認した時のメモ書きです。

参照したサイト・書籍

  1. What’s New in IntelliJ IDEA 2020.1
    https://www.jetbrains.com/idea/whatsnew/

目次

  1. In-editor Javadocs rendering
  2. Code Vision
  3. Zen Mode(新機能)と Presentation Mode(既存機能)
  4. Smart Grammar and Spell Checker
  5. Quick Definition(既存機能)と Quick Type Definition(新機能)

手順

In-editor Javadocs rendering

ソースコード上に記述した JavaDocIntelliJ IDEA のエディタ上でレンダリングしてくれる機能です。Settings ダイアログを開き Editor -> General -> Appearance の中で「Renter documentation comments」をチェックすると常時 JavaDoc がフォーマットされて表示されます。

f:id:ksby:20200502225951p:plain f:id:ksby:20200502230312p:plain

ただし使ってみた感想としては、通常は JavaDoc のコードで表示しておいてフォーマットして表示したい時だけ切り替えたいところ。この場合には Ctrl+Alt+Q を押せば切り替えられます。

f:id:ksby:20200502230656g:plain

Code Vision

IntelliJ IDEA のエディタ上にクラス・インターフェースやメソッドの使用数、実装数を表示してくれる機能です。Settings ダイアログを開き Editror -> Inlay Hints -> Java の「Code Vision」の「Usages」「Inheritors」をチェックすると表示されます。

f:id:ksby:20200502231211p:plain f:id:ksby:20200502232127p:plain

使用数、実装数はリンクになっており、マウスでクリックすると一覧が表示されて使用先、実装先へジャンプすることが出来ます。

f:id:ksby:20200502231856g:plain

個人的には使用先や実装先はそんなに頻繁に参照しないので、この機能は通常は OFF かな。

Zen Mode(新機能)と Presentation Mode(既存機能)

Zen Mode とはこの画面から、

f:id:ksby:20200502235436p:plain

メインメニューで View -> Appearance -> Enter Zen Mode を選択すると、

f:id:ksby:20200502235551p:plain

こうなる Mode です。エディタ部分を全画面にしたかったのですが、その方法は分かりませんでした。

f:id:ksby:20200503000348p:plain

メインメニューで View -> Appearance -> Exit Zen Mode を選択すると元に戻ります。

f:id:ksby:20200503000725p:plain

個人的にはエディタのタブをクリックして全画面にした方が使い勝手がいいかな、という気がしています。

Zen Mode は使う場面が分からなかったのですが、試している時に気づいた Presentation Mode は人にソースを見せながら説明するのに便利そうです。

View -> Appearance -> Enter Presentation Mode を選択するとソースコードが全画面で大きく表示されます(下の画像は一番最初の画像と同じサイズです、文字がとても大きく表示されています)。

f:id:ksby:20200503001510p:plain

こちらも View -> Appearance -> Exit Presentation Mode を選択すると元に戻ります。

Smart Grammar and Spell Checker

以前 Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( 番外編 )( IntelliJ IDEA の Grazie・GitToolBox プラグインを追加する ) でインストールした Grazie プラグインが 2020.1 から bundle されたとのこと。

Settings ダイアログを開き Editor -> Proofreading -> Grammar に設定があります。Java, Javascript はデフォルトではチェックされていませんが、チェックしておきます。

f:id:ksby:20200503002805p:plain

Quick Definition(既存機能)と Quick Type Definition(新機能)

Quick Definition は型やメソッドにカーソルを移動してから Ctrl+Shift+I(あるいはメインメニューから View -> Quick Definition)を押すと、実際のソースにジャンプせずにポップアップで実装を確認できる機能です。既存機能とのこと(知りませんでした。。。)

f:id:ksby:20200503004809g:plain

ただしこの機能は変数の上では機能しません。変数にカーソルを移動してからポップアップで実装を確認できるようにしたのが Quick Type Definition です。デフォルトではショートカットは割り当てられておらず、メインメニューから View -> Quick Type Definition を選択すると機能します。

f:id:ksby:20200503005941g:plain

これは良く使いそうな気がします。ショートカットがないのが残念なので Ctrl+Shift+@ を割り当てることにします。

履歴

2020/05/03
初版発行。