※ build.gradleのJUnit用記述を修正しました。誤った情報記載して申し訳ありません。
はじめに
炭山水です、こんばんわ。
ちょっと自分でもSpringBoot使っていろいろ作ってみようと思うのですが、その下準備としていったん開発が始められそうなところまで持っていく備忘録をまとめました。
IntelliJのインストール方法や、JDKの入れ方とかはほかでいくらでも記事があるのでそちらに譲るとして、IntelliJ + Gradle + SpringBoot + JUnit5(jupiter)の組み合わせだといろいろ躓くので、その辺毎回躓かないために備忘録を残している感じです。
前提
- IntelliJのインストールが済んでいること
- JDKのインストールが済んでいること
こんな人向け
- SpringBoot開発にEclipseやSTSは使ってるけどIntelliJに乗り換えてみたい
- JUnit4で消耗してる
環境
- Windows10 Pro
- IntelliJ IDEA 2019.1.3 Community Edition
- OpenJDK : Java12
作業手順
新規プロジェクトの作成
File > New > Project
GradleとJavaをチェック
GroupIdとArtifactIdは任意でOK
この辺はお好みでいいと思う。
特に書き換える必要なし
待ちます
こんな感じになるはず。
とりあえず適当にテキストを返すControllerを作るまで
build.gradleの設定
Springを使いたいので、build.gradleを書き換えていきます。
plugins {
id 'java'
}
group 'net.tan3sugarless.clustering-sample'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
プロジェクト作成直後はこんな感じになってるはずです。
buildscript {
ext {
springBootVersion = '2.1.6.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'idea'
group 'net.tan3sugarless.clustering-sample'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
buildscript,apply plugin,dependenciesをいじりました。
あと、pluginsを消しています。残してもいいかもしれない…。
アクセスポイント(Controller)の作成
そしたら実際にWebからアクセスするアクセスポイントとしてControllerクラスが動くようにしていきます。
とりあえず、この時点ではpackageすらないので作っていきます。
Projectツリーのsrc/main/javaを右クリックして、New > packageでpackageを作りましょう。
開いた画面でpackage名を入力します。
※ プロジェクトのartifactIdミスったかも・・・まあいいか。
packageができました。出来上がったpackageをまた右クリック、New > Java Classと開きます。
開いた画面でまずはApplicationクラスを作ります。Controllerはちょっと待ってね。
package net.tan3sugarless.clusteringsample;
public class ClusteringSampleApplication {
}
するとまっさらなクラスが作られます。こいつにSpringのApplicationクラスとしての記述を足していきましょう。
このApplicationクラスを実行することで、これから追加するControllerクラスをはじめ、Webサーバーアプリケーションとしての機能が立ち上がるわけです。
package net.tan3sugarless.clusteringsample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ClusteringSampleApplication {
public static void main(String[] args) {
SpringApplication.run(ClusteringSampleApplication.class, args);
}
}
こんな感じに書き換えてください。「ClusteringSampleApplication」のところは各自ご自身のクラス名に置き換えてください。
さて、いよいよControllerクラスです。
さらにcontroller packageを先ほどと同じ手順で作ります。別になくてもいいですが、直下にべたべたクラス置くのもね。。。
で、やはりApplicationクラスと同じ手順で「DemoController」クラスを作りましょう。
package net.tan3sugarless.clusteringsample.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/demo")
public String demo(){
return "Hello SpringBoot demo!";
}
}
作ったクラスはこんな感じにします。とりあえずなんでも返せればいいのでRestControllerで。
もっとまじめにjson返したりもいったんパス。テキストメッセージを表示します。
Controllerができたら、Applicationクラスを右クリックしてRunしてみましょう
Controllerにstartedと表示されたら立ち上がっています。
ほんとはcurlコマンドとかapi tester使うとカッコいいんだけど、とりあえずはブラウザから
ここにアクセスしてコードに書いたとおりの文字列が表示出来たら成功!
ほんとはlombokとかフツーに使うだろってのも紹介しときたいけどいったん割愛。
JUnit5(jupiter)を動かす
テストはこまめに書いておきたいので、JUnit5の準備も早めにしておきましょう。
ネットを漁るとJUnit4の情報がまだまだ多いですが、僕はParameterizedTest無しには生きられない体なので、JUnit5(jupiter)を設定します。
基本的にはここ読んでって話だけど、備忘録的に自分でもやってみて書いておきます。
Baeldung | Using JUnit 5 with Gradle
https://www.baeldung.com/junit-5-gradle
build.gradleの追記
まずJUnitを使えるようにしないといけないので、build gradleに追記します。
buildscript {
ext {
springBootVersion = '2.1.6.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'idea'
group 'net.tan3sugarless.clustering-sample'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compileOnly "org.projectlombok:lombok:1.18.8"
testCompileOnly "org.projectlombok:lombok:1.18.8"
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
// for JUnit
testCompile 'org.junit.jupiter:junit-jupiter-api:5.3.2'
testCompile 'org.junit.jupiter:junit-jupiter-params:5.3.2'
testCompile 'org.junit.jupiter:junit-jupiter-engine:5.3.2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.3.2'
}
// for JUnit
test {
useJUnitPlatform {
includeEngines 'junit-jupiter'
}
}
for JUnit とコメント入れたところが足したコードです
適当なテストコードを書いてみる
走ったことが確認できればいいので、テスト対象メソッドの作成はさておいて、Assertionだけ見られれば良しとしますね。
テスト対象のメソッド作らないのでpackageそろえる意味もないのですが、なんとなくsrc/main/javaと同じpackageをsrc/test/javaにも作ります。
テストクラスも適当な名前でとりあえず作ります。
package net.tan3sugarless.clusteringsample.controller;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
public class DemoTest {
static Stream<Arguments> demoProvider(){
return Stream.of(
Arguments.of(1,1,2),
Arguments.of(2,2,4)
);
}
@ParameterizedTest
@MethodSource("demoProvider")
@DisplayName("Parameterizedテストのデモ")
void demo(int i, int j, int expected){
Assertions.assertEquals(expected,i+j);
}
@Test
void fail(){
Assertions.fail();
}
}
すごく意味のないテストですが、demoなんでご容赦を。
あと、ちゃんと動いてるか見るためにわざとこけさせています。
test/javaを右クリックして、Run Test in ...を実行しましょう。テストが全ケース走ります。
ちゃんと想定通りfail()メソッドでコケてくれました。
おしまい。
おわりに
本当はTestRunnerをGradleから変更するか、成功ケースも確認可能にするかくらいまでやりたかったですが、今日はいったんここまで。
別の機会で解説できればと思いますノシ
Twitterもやってますよろしくね。
( Twitter @tan3_sugarless )