概要
STSでJUnit5を使ってみます。
主に自分用備忘録。
JUnit5とは、Javaテスト用フレームワークJUnitの最新バージョンです。
STSについては後述で紹介記事へリンクを貼ります。
開発環境は次の通りです。
OS : Windows 7 Home Edition 64bit
Java : JavaSE 15
STS : 4.10.0
STSのセットアップ
こちらからダウンロード、4.10.0 - WINDOWS 64-BITを使用しました。
4.10.0はjar形式で提供されていて、
解凍はダブルクリックで、sts-4.10.0-RELEASEフォルダが作成されます。
その後のセットアップは自分の備忘録を参考にしました。
「STSって何?」という方もよろしければご覧ください。
この記事ではSTSのフォルダをc:\sts-4.10.0にしています。
プロジェクトの作成
STSを起動して、下記のCreate new Spring Starter Projectをクリックします。
プロジェクトの設定をします。
デフォルト(初期値)から変更した箇所はJava Versionのみです。
Spring Bootのライブラリ参照を設定します。
デフォルトからSpring Bootのバージョンを2.4.4にしています。
注意点:JUnit5をこの段階でライブラリ参照設定できません。
Unit5を参照する方法
まず、参照するライブラリとして追加します。参考記事はこちら。
Maven Repositoryを検索して、2021/4/11時点で最新バージョン5.7.1を
pom.xmlに以下を追記します。
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
追記する箇所ですが、pom.xmlの<dependencies>
タグ内です。
pom.xmlはSTSでプロジェクト作成した際に自動生成されています。
追記するとこうなります。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>15</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- ここから追記 -->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
<!-- ここまで追記 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
参照ライブラリをダウンロードします。
プロジェクトルートを選択、右クリック->Maven->Update projectをクリック
JUnit5参照ができましたが、参照しているJREがJavaSE-15になっているため、修正します。
2021/4/11時点ではSTSにJavaSE 16がバンドル(同梱)されていないためです。
STSにバンドルされていないJREを指定する方法
※下記の方法はSTSのworkspaceのJREを指定する方法です。
手順をご存知の方は読み飛ばして、次の段落からご覧ください。
JRE System Libraryを右クリック->Build Path->Configure Build Path...を選択します。
JRE System Libraryをクリック、Editボタンをクリックします。
Standard VMをクリック、Nextボタンをクリックします。
JRE home:のDirectoryボタンをクリックします。
JavaSE 16のインストールディレクトリ
(デフォルトだとC:\Program Files\Java\jdk-16)を選択します。
ライブラリが表示されたら、Finishボタンをクリックします。
jdkの方をチェックして、Apply and Closeボタンをクリックします。
ラジオボタンでAlternative JREを選択、
ドロップダウンからjdk-16を選択、
Finishボタンをクリックします。
参照するJREを変更できました。
詰まっている箇所
JRE参照ライブラリを切り替えてからMavenのUpdate Projectを実行したところ、
JavaSE 15にリセットされました。
色々調べた結果、spring-boot-maven-pluginの本家を確認しましたが、
記事初版投稿時点(2021/4/11)ではJavaSE 15で試しています。
他にもmaven-compiler-plugin関連ではありますが、
こちらとか、こちらも拝見しました。
Lombokをインストールする
ボイラープレートを書かないようにするため、
Lombok本家セットアップ手順を見ながら、
Lombokをインストールします。
テスト対象を作る
テスト対象はシンプルで確実な答えがあるものにしたかったので、
フィボナッチ数を指定した数だけ計算、配列として保持するクラスを用意しました。
package com.example.demo;
import lombok.Data;
/**
* フィボナッチ数を作成するクラス
*
* @author harayoshi
*/
@Data
public class FibonacciNumberCreator {
private final int[] atFirstArray = {0, 1};
private final String messateTemplate = "F%s = %s\r\n";
/** フィボナッチ数のリスト */
private int[] fibonacciNumbers;
/**
* コンストラクタ(フィボナッチ数のリスト作成)
*
* @param size
*/
public FibonacciNumberCreator(int size) {
// サイズが負の数の場合、リストの最小デフォルト値を設定
if (size < 0) {
size = atFirstArray.length;
}
// 1,2番目をリストに格納
fibonacciNumbers = new int[size];
for (int i = 0; i < atFirstArray.length; i++) {
fibonacciNumbers[i] = atFirstArray[i];
}
// 3番目以降を計算、リストに格納
for (int i = 2; i < size; i++) {
int next = fibonacciNumbers[i - 2] + fibonacciNumbers[i - 1];
fibonacciNumbers[i] = next;
}
}
/**
* インスタンスが持つリストをテンプレートを使って文字列化
*/
@Override
public String toString() {
String message = "";
// 要素ごとにメッセージを追記
for (int i = 0; i < this.getFibonacciNumbers().length; i++) {
message += String.format(messateTemplate, String.valueOf(i), String.valueOf(this.getFibonacciNumbers()[i]));
}
return message;
}
}
このクラスに対してJUnit5のテストケースを作成します。
テスト対象クラスを右クリック->New->JUnit Test Case
Which method stubs would you like to create?は全てチェック有りにして、
Nextボタンをクリックします。
ちなみに、JUnitのバージョンはデフォルトで選択状態でした。
テスト対象メソッドを選択して、Finishボタンをクリックします。
クラスが作成されました。
package com.example.demo;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class FibonacciNumberCreatorTest {
private FibonacciNumberCreator creator;
@BeforeAll
static void setUpBeforeClass() throws Exception {
}
@AfterAll
static void tearDownAfterClass() throws Exception {
}
@BeforeEach
void setUp() throws Exception {
}
@AfterEach
void tearDown() throws Exception {
}
@Test
void testToString() {
fail("Not yet implemented");
}
}
クラスを作成する前に正解となるフィボナッチ数列をこちら確認しました。
クラスは次の通りに書き換えました。
package com.example.demo;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class FibonacciNumberCreatorTest {
private FibonacciNumberCreator creator;
@BeforeAll
static void setUpBeforeClass() throws Exception {
// no implements
}
@AfterAll
static void tearDownAfterClass() throws Exception {
// no implements
}
@BeforeEach
void setUp() throws Exception {
// no implements
}
@AfterEach
void tearDown() throws Exception {
creator = null;
}
@Test
void testToString() {
int size = 4;
creator = new FibonacciNumberCreator(size);
int[] expected = {0, 1, 1, 2};
int[] actual = creator.getFibonacciNumbers();
Assertions.assertArrayEquals(expected, actual);
}
}
テスト実行時はテストクラスを右クリック->Run As->JUnit Testをクリックします。
テスト元クラスを確認するダイアログが表示されますが、
そのままOKボタンをクリックします。
結論
簡単なプログラム、テストのみでの確認ですが、今回分かったのは
STSは「JUnitのバージョンに合わせて、JUnit5でもこれまでと同じ手順でテスト実行できる」
ということです。
最後まで読んでいただき、ありがとうございました。