【Assertj】あまり知られてないアサーションメソッドPath編

# はじめに
みなさん、単体テストを書くときにどのアサーションを使うか考えていますか？
おそらく多くの方がしっかりと考えて書いていると思います。
~~まさかisEqualToしか使ってないなんてことはないですよね？~~
ここではPathインターフェースを対象としたアサーションメソッドを紹介します。


:::note warn
ここではアサーションメソッドのみを紹介します。
テストに関するベストプラクティスなどには触れません。
:::

## 環境について
- Java17
- SpringBoot 3.1.2
- spring-boot-starter-test
    - JUnit 5.9.3
    - assertJ 3.24.2

# AbstractPathAssert
assertThatにPathを指定するとこのAssertクラスが返されます。
java.nio.file.Pathに含まれるメソッドに近いものを一通りカバーしています。

## exists()
対象のパスが**存在すること**をテストするアサーション。
```Java:exists
@Test
public void path() {

    var exists = Path.of("C:\\home", "user", "exists");
    var notExist = Path.of("C:\\home", "user", "notExists");
    
    // 成功
    assertThat(exists).exists();

    // 失敗
    assertThat(notExist).exists();
}
```

```text:exists 失敗時のメッセージ
java.lang.AssertionError: 
Expecting path:
  C:\home\user\exists
to exist (symbolic links were followed)
```

## doesNotExist()
対象のパスが**存在しないこと**をテストするアサーション。
```Java:doesNotExist
@Test
public void path() {

    var exists = Path.of("C:\\home", "user", "exists");
    var notExist = Path.of("C:\\home", "user", "notExists");
    
    // 成功
    assertThat(notExist).doesNotExist();

    // 失敗
    assertThat(exists).doesNotExist();
}
```

```text:doesNotExist 失敗時のメッセージ
java.lang.AssertionError: 
Expecting path:
  C:\home\user\notExists
not to exist
```
## isAbsolute()
対象のパスが**絶対パスであるか**テストするアサーション。
実際に存在するかは問わない。存在しないフォルダ、ファイルでもOK。

```Java:isAbsolute
@Test
public void path() {
    var absolutePath = Path.of("C:\\home", "user", "absolute");
    var unnormalizedAbsolutePath = Path.of("C:\\home", "user", "..", "absolute");
    var relativePath = Path.of("..", "user", "example");

    // 成功
    assertThat(absolutePath).isAbsolute();
    assertThat(unnormalizedAbsolutePath).isAbsolute();

    // 失敗
    assertThat(relativePath).isAbsolute();
}
```
```text:isAbsolute 失敗時のメッセージ
java.lang.AssertionError: 
Expecting actual:
  ..\user\example
to be an absolute path.
```

## isRelative()
対象のパスが**相対パスであるか**テストするアサーション。
ちょうどisAbsoluteの逆。
isAbsoluteと同じく実際に存在するかは問わない。

```Java:isRelative
@Test
public void path() {
    var absolutePath = Path.of("C:\\home", "user", "absolute");
    var relativePath = Path.of("..", "user", "example");

    // 成功
    assertThat(relativePath).isRelative();

    // 失敗
    assertThat(absolutePath).isRelative();
}
```
```text:isRelative 失敗時のメッセージ
java.lang.AssertionError: 
Expecting actual:
  C:\home\user\absolute
to be a relative path.
```

## isNormalized()
 対象のパスが**正規化されているか**テストするアサーション。
 isAbsoluteやisRelativeと同じく実際に存在するかは問わない。
```Java:isNormalized
@Test
public void path() {
    var absolutePath = Path.of("C:\\home", "user", "absolute");
    var unnormalizedAbsolutePath = Path.of("C:\\home", "user", "..", "absolute");
    var normalizedPath = Path.of("user", "example");

    // 成功
    assertThat(normalizedPath).isNormalized();
    assertThat(absolutePath).isNormalized();

    // 失敗
    assertThat(unnormalizedAbsolutePath).isNormalized();
}
```


```text:isNormalized 失敗時のメッセージ
java.lang.AssertionError: 
Expected path:
  C:\home\user\..\absolute
to be normalized.
```

# 感想
ファイルの入出力はよくある内容かと思います。
適切なアサーションを使ってコードを綺麗に、メッセージもわかりやすいものを出していきたいですね。


# 参考
https://javadoc.io/static/org.assertj/assertj-core/3.24.2/org/assertj/core/api/AbstractPathAssert.html