コードのテスト可能性は、効率的なコード設計において維持容易性など、いくつかの優れた点を保証します。文書化を支援し、リファクタリングや進化する設計/アーキテクチャの構築を容易にします。これについては疑いの余地がありませんが、プロジェクトを始めるにあたって良いテストスタックとは何でしょうか?このビデオでは、Javaでプロジェクトを始めるための最小限のテストスタックについて説明します。
テストスタックにおける最小限の考え方を理解する最初のポイントは、銀の弾丸は存在しないということです。結局のところ、特にレガシーコードについて話すときには、依存関係を追加したり削除したりする必要があります。それを考えると、私がJavaでお気に入りのテストスタックを紹介し、私自身が使用し、ゼロから始めるための最小限としてお勧めします:
-
JUnit-Jupiter:JUnitの第五版は前のバージョンとの互換性を断ち切りますが、カスタム拡張を作成するための多くの機能をもたらすため、それは価値があります。
-
Mockito:Javaで非常に人気のあるモックフレームワークです。この人気と巨大なコミュニティにより、JUnit-Jupiterなどとの拡張が可能になります。
-
AssertJ: 私のように流暢なAPIが好きなら、AssertJはあなたにとって異色のライブラリです。
Mavenプロジェクトを使用すると、これらのライブラリの依存関係を追加できます。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.verson}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.verson}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.verson}</version>
<scope>test</scope>
</dependency>
サッカーのチャンピオンシップリーグのコンテキストでは、チームは11人の選手を持つべきであり、各名前はチャンピオンシップリーグ内で一意であるべきです。これについてテストを探求できます。
JMockitoでのテストから始めますが、サービスのテストを行い、データベースから名前が存在するかどうかを確認する必要があります。この時点で、それを必要としないし、統合テストを作成したくないです。
私たちはビジネスに焦点を当てたいので、データベースやフレームワークをテストしたくないです。私のコードだけをテストします。そのため、リポジトリを2つのシナリオ、名前が存在する場合と存在しない場合にモックします。
MockitoとJUnit-Jupiterの統合を使用すると、アノテーションのみを使用してモックを注入できます。以下のコードは、JMockitoを使用したテストを示しており、ビジネスをテストする焦点を外すことなく、データベースが必要ないことを示しています。
@ExtendWith(MockitoExtension.class)
class ChampionshipServiceTest {
@Mock
private ChampionRepository repository;
@InjectMocks
private ChampionshipService service;
@Test
public void shouldRegister() {
Mockito.when(repository.existByName("Bahia")).thenReturn(false);
Team bahia = Team.of("Bahia");
service.register(bahia);
Mockito.verify(repository).existByName("Bahia");
}
@Test
@DisplayName("should return an exception when there is a team with a name")
public void shouldThrownAnExceptionWhenTeamNameExists() {
Mockito.when(repository.existByName("Bahia")).thenReturn(true);
Team bahia = Team.of("Bahia");
Assertions.assertThrows(IllegalArgumentException.class, () ->
service.register(bahia));
Mockito.verify(repository).existByName("Bahia");
}
}
AssertJは、ライブラリがサポートするフルーティアプリケーション・プログラミング・インターフェース(API)のおかげで、アサーションをより理解しやすくします。コレクション、マップ、または単一のインスタンスをテストできます。たとえば、それを使ってチームにプレイヤーを追加することを検証できます。
@Test
public void shouldCreatePlayers() {
Team bahia = Team.of("Bahia");
bahia.add(Player.of("Neymar", "Santos", 10));
bahia.add(Player.of("Cristiano Ronaldo", "Lisbon", 10));
org.assertj.core.api.Assertions.assertThat(bahia.players())
.hasSize(2)
.map(Player::name)
.contains("Neymar", "Cristiano Ronaldo");
}
この動画でさらに詳しく説明します。
ポイント:
-
A minimum test stack to start Java
-
JUnitについてもっと学び、なぜそれが良い選択か理解する
-
JMockitoでモックを探求し、それについて学ぶ
-
フルーティアプリケーション・プログラミング・インターフェース(API)のAssertJで、テストを美しくする
Source:
https://dzone.com/articles/creating-your-swiss-army-knife-on-java-test-stack