Mavenプロジェクトで単体テストを実行する

# 1.環境
前回作成したMavenで構築したJavaプロジェクトに、テストを追加する。
[前回記事](https://qiita.com/fullbatch/items/70232d68e1eeabfbfcf5)

# 2.テストモジュールの作成
以下のフォルダ構成を作成する
C:\
└ maven\
　└ demo\
　　└ src\
　　　└ test\
　　　　└ java\
　　　　　└ hello\

VSCodeにて`Ctrl+Shift+＠`を入力してターミナル(PowerShell)を起動する
以下のコマンドでフォルダを作成してVSCodeでフォルダを開く

```powershell
> mkdir C:\maven\demo\src\test\java\hello
> code -r C:\maven\demo
```

以下のモジュールを作成
- src/test/java/hello/GreeterTest.java

```java:src/test/java/hello/GreeterTest.java
package hello;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;

import org.junit.Test;

public class GreeterTest {

  private Greeter greeter = new Greeter();

  @Test
  public void greeterSaysHello() {
    assertThat(greeter.sayHello(), containsString("Hello"));
  }

}
```

Maven は、「surefire」というプラグインを使用して単体テストを実行する。
surefireのデフォルト構成は、src/test/java配下の*Test と一致する名前を持つすべてのクラスをコンパイルして実行する。

# 3.テストの実行
`mvn test`コマンドを実行して、テストを実施する。

```powershell
> mvn test
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------< org.springframework:maven-test >-------------------
[INFO] Building maven-test 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 

（中略）

junit4/2.12.4/surefire-junit4-2.12.4.jar (37 kB at 100 kB/s)


Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.641 s
[INFO] Finished at: 2020-11-24T13:38:48+09:00
[INFO] ------------------------------------------------------------------------
```
ビルドの最後でJUnitによるテストが実行されていることがわかる。
このテストの結果としては、Failures/Errorsがともに0件であり、結果としてビルドは成功する。

このテストがNGだった場合の動きを見てみる。
テスト用モジュールを以下のように修正。

```java:src/test/java/hello/GreeterTest.java
package hello;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;

import org.junit.Test;

public class GreeterTest {

  private Greeter greeter = new Greeter();

  @Test
  public void greeterSaysHello() {
    // assertThat(greeter.sayHello(), containsString("Hello"));
    assertThat(greeter.sayHello(), containsString("Wello"));
  }

}
```
Greeter.classのsayHelloメソッドが返す文字列が"Wello"を含んでいるとテストOKとする。
Greeterは修正していないため、当然"Hello World!"を返すため、テストはNGとなるはず。

```powershell
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running hello.GreeterTest
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.092 sec <<< FAILURE!
greeterSaysHello(hello.GreeterTest)  Time elapsed: 0.015 sec  <<< FAILURE!
java.lang.AssertionError:
Expected: a string containing "Wello"
     but: was "Hello world!"
（中略）
Results :

Failed tests:   greeterSaysHello(hello.GreeterTest): (..)

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.501 s
[INFO] Finished at: 2020-11-24T13:49:03+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project maven-test: There are test failures.
```

このように、テストの結果にFailureがあることで、ビルド自体もNGとなる。

# 参考
[参考サイト](https://spring.pleiades.io/guides/gs/maven/)