VSCodeでJUnitを動かせるようにする

# 前提
会社の部活動でテストコードを勉強中。
会社PCではSTSを使っているが、自宅では見栄えがよいVScodeを使いたい。
ということで、VScodeでJunitを使うためのメモ。

# 流れ
 1. JDKインストール
 2. Java Extension Packインストール
 3. Java プロジェクト作成
 4. JUnit テスト実行

## 1. JDKインストール
適当にダウンロードしてインストールする。
JDKのパスを確認しておく。
今回は以下のバージョンとする。
`C:\Program Files\Java\jdk-11.0.9`

## 2. Java Extension Packインストール
VSCodeに拡張機能のJava Extension Packをインストールする。
機能の説明は次のとおり。
`Java Test Runner`にJUnitが含まれる。
>Java Extension Pack
>Java Extension Pack is a collection of popular extensions that can help write, test and debug Java applications in Visual Studio Code. Check out Java in VS Code to get started.
>
>Extensions Included
>By installing Java Extension Pack, the following extensions are installed:
>
>📦 Language Support for Java™ by Red Hat
>Code Navigation
>Auto Completion
>Refactoring
>Code Snippets
>📦 Debugger for Java
>Debugging
>📦 Java Test Runner
>Run & Debug JUnit/TestNG Test Cases
>📦 Maven for Java
>Project Scaffolding
>Custom Goals
>📦 Project Manager for Java
>Manage Java projects, referenced libraries, resource files, packages, >classes, and class members
>📦 Visual Studio IntelliCode
>AI-assisted development
>Completion list ranked by AI

### Java Home設定
初期設定として`JAVA HOME`を設定する。
`Ctrl+,`で設定タブから`Java: Home`を入力すると設定箇所がたくさん表示される。
`Java: Home`を選択する。
![JavaHomeのsettingjson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133122/ee641acf-46f7-9145-2312-23a41c67beac.png)

setting.jsonが開くので、以下行を追加する。
`\`は2つ並べないといけないので注意。
`"java.home": "C:\\Program Files\\Java\\jdk-11.0.9"`

- setting.json

```json
{
    "workbench.sideBar.location": "right",
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "files.exclude": {
        "**/.classpath": true,
        "**/.project": true,
        "**/.settings": true,
        "**/.factorypath": true
    },
    "java.home": "C:\\Program Files\\Java\\jdk-11.0.9"
}
```

## 3. Java プロジェクト作成
1. `Ctrl+Shift+p` でコマンドパレットを開き `Java: Create java Project` を選択。
2. `Select the project type` で `Maven` を選択。
3. `Select an archetype` で `maven-archetype-quickstart` を選択。
4. `Select a version` で `1.4` を選択。
5. フォルダーを選択。
6. VSCodeのターミナルでビルド処理が動き出して入力待ちで止まる。
![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133122/a53a69e8-36a3-e314-dcb1-2bb77c7b514b.png)
7. `Define value for property 'groupId':` で「プロジェクトが属する組織や上位プロジェクトを識別できる名前(.区切り)」【例：com.example】を入力。
8. `Define value for property 'artifactId':` で「jar/warの名前」【例：test】を入力。 
9. `Define value for property 'version' 1.0-SNAPSHOT: :  ` そのままEnter。
10. `Define value for property 'package' test: : ` でそのままEnter。
11. ` Y: :`でそのままEnter。

ターミナルはPowerShellで出力内容例は以下のとおり。

```powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\Users\tomoo> cd "c:\Users\tomoo\.vscode\extensions\vscjava.vscode-maven-0.28.0\resources\maven-wrapper"
PS C:\Users\tomoo\.vscode\extensions\vscjava.vscode-maven-0.28.0\resources\maven-wrapper> & "c:\Users\tomoo\.vscode\extensions\vscjava.vscode-maven-0.28.0\resources\maven-wrapper\mvnw.cmd" org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate -DarchetypeArtifactId="maven-archetype-quickstart" -DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4" -DoutputDirectory="c:\Users\tomoo\src"
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.1.2:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.1.2:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.1.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-quickstart:1.4] found in catalog remote
Define value for property 'groupId': com.example
Define value for property 'artifactId': test
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' com.example: : 
Confirm properties configuration:
groupId: com.example
artifactId: test
version: 1.0-SNAPSHOT
package: com.example
 Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: test
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: packageInPathFormat, Value: com/example
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: test
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Project created from Archetype in dir: c:\Users\tomoo\src\test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:54 min
[INFO] Finished at: 2021-03-27T13:54:27+09:00
[INFO] ------------------------------------------------------------------------
PS C:\Users\tomoo\.vscode\extensions\vscjava.vscode-maven-0.28.0\resources\maven-wrapper> 
```
### ビルドされたモノの確認
`artifactId`の名前のフォルダが作成される。
ツリー構造は次のとおりで`pom.xml`、`App.java`、`AppTest.java`が作成されている。

```bash
├─test
│  │  pom.xml
│  │
│  └─src
│      ├─main
│      │  └─java
│      │      └─com
│      │          └─example
│      │                  App.java
│      │
│      └─test
│          └─java
│              └─com
│                  └─example
│                          AppTest.java
```

#### pom.xml

```xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>test</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
```
#### App.java

```java
package test;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}
```
#### TestApp.java

```java
package test;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }
}
```
## 4. JUnit テスト実行
最後にJUnitを動作確認する。
1. VScodeのエクスプローラでビルドで指定したフォルダを開く。
2. AppTest.java で 右クリック-Run Java をクリックする。
![RunJava.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133122/fbdee0e2-235d-fbad-086d-57f75db8e9f7.png)
3. ポップアップが出るのでYesをクリックする。
![popup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133122/3c9b6754-8330-db02-8f70-d6c95c459b7d.png)
4. AppTest.javaファイルを開く。
5. Run Testをクリックする。
6. VScode下部のステータスバーの バツ数字チェック数字 をクリックし、Java Test Reportを開く。
グリーンバーになっておりテストOKであることを確認する。
![RunTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133122/d771dbf4-809a-b251-74bf-e19d20d611f9.png)
![JUnit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133122/9352c214-4eb5-c723-19d7-59692a0d9ac3.png)