はじめに
みなさん、単体テストを書くときにどのアサーションを使うか考えていますか?
おそらく多くの方がしっかりと考えて書いていると思います。
まさかisEqualToしか使ってないなんてことはないですよね?
ここではPathインターフェースを対象としたアサーションメソッドを紹介します。
ここではアサーションメソッドのみを紹介します。
テストに関するベストプラクティスなどには触れません。
環境について
- 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()
対象のパスが存在することをテストするアサーション。
@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();
}
java.lang.AssertionError:
Expecting path:
C:\home\user\exists
to exist (symbolic links were followed)
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();
}
java.lang.AssertionError:
Expecting path:
C:\home\user\notExists
not to exist
isAbsolute()
対象のパスが絶対パスであるかテストするアサーション。
実際に存在するかは問わない。存在しないフォルダ、ファイルでもOK。
@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();
}
java.lang.AssertionError:
Expecting actual:
..\user\example
to be an absolute path.
isRelative()
対象のパスが相対パスであるかテストするアサーション。
ちょうどisAbsoluteの逆。
isAbsoluteと同じく実際に存在するかは問わない。
@Test
public void path() {
var absolutePath = Path.of("C:\\home", "user", "absolute");
var relativePath = Path.of("..", "user", "example");
// 成功
assertThat(relativePath).isRelative();
// 失敗
assertThat(absolutePath).isRelative();
}
java.lang.AssertionError:
Expecting actual:
C:\home\user\absolute
to be a relative path.
isNormalized()
対象のパスが正規化されているかテストするアサーション。
isAbsoluteやisRelativeと同じく実際に存在するかは問わない。
@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();
}
java.lang.AssertionError:
Expected path:
C:\home\user\..\absolute
to be normalized.
感想
ファイルの入出力はよくある内容かと思います。
適切なアサーションを使ってコードを綺麗に、メッセージもわかりやすいものを出していきたいですね。
参考