junit について
Java 開発者向けの JUnit 5 クイックリファレンススキルです。一般的なテストパターンやアノテーション、アンチパターン、トラブルシューティングを扱います。
主な機能
- 01JUnit 5 のテストパターン
- 02Mockito によるサービスのテスト
- 03Spring Boot テスト例
- 04一般的なアノテーション
- 05アンチパターンとトラブルシューティング
活用シーン
- 01Java コードの単体テスト作成
- 02Mockito を使ったサービスのテスト
- 03Spring Boot のコントローラーやリポジトリのテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill junitインストール後、Claude Code で/junitを入力して読み込まれたか確認します。
詳細
JUnit 5 - クイックリファレンス
詳しい知識:包括的なドキュメントについては、テクノロジーに
junitを指定してmcp__documentation__fetch_docsを使用してください。
このスキルを使用しない場合
- コンテナーを使用する統合テスト - Docker ベースのテストには
testcontainersを使用してください - REST API テスト - HTTP/REST のテストには
rest-assuredを使用してください - Web の E2E テスト - Selenium または Playwright を使用してください
- JavaScript/TypeScript - JS/TS には
vitestまたはjestを使用してください - データベース統合テスト -
spring-boot-integrationスキルと組み合わせてください
基本パターン
基本的なテスト
@Test
void shouldAddNumbers() {
assertEquals(5, calculator.add(2, 3));
assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
}
Mockito + サービステスト
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserServiceImpl userService;
@Test
void shouldCreateUser() {
when(userRepository.save(any())).thenReturn(user);
UserResponse result = userService.create(request);
assertNotNull(result);
verify(userRepository, times(1)).save(any());
}
}
Spring Boot テスト
@SpringBootTest
@ActiveProfiles("test")
class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
@Test
void contextLoads() {
assertNotNull(userService);
}
}
コントローラーテスト
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void shouldReturnUsers() throws Exception {
when(userService.findAll()).thenReturn(users);
mockMvc.perform(get("/api/v1/users"))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].name").value("John"));
}
}
リポジトリテスト
@DataJpaTest
class UserRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository userRepository;
@Test
void shouldFindByEmail() {
entityManager.persist(user);
Optional<User> found = userRepository.findByEmail("[email protected]");
assertTrue(found.isPresent());
}
}
よく使うアノテーション
| アノテーション | 用途 |
|---|---|
@Test | テストメソッド |
@BeforeEach | 各テストの前にセットアップ |
@Mock | モックを作成 |
@InjectMocks | モックを注入 |
@SpringBootTest | 統合テスト |
@WebMvcTest | コントローラーテスト |
@DataJpaTest | リポジトリテスト |
アンチパターン
| アンチパターン | 問題点 | 解決策 |
|---|---|---|
| 単体テストで @SpringBootTest を使用する | 非常に遅い | @ExtendWith(MockitoExtension.class) を使用する |
| プライベートメソッドをテストする | 実装に依存する | パブリック API を通じてテストする |
| モックをクリーンアップしない | テスト同士が影響し合う | @BeforeEach、Mockito.reset() を使用する |
| テストデータをハードコードする | 保守が難しい | テストデータビルダーまたはファクトリーを使用する |
| モックの呼び出しを検証しない | 失敗が見逃される | verify() を使用してメソッドが呼び出されたことを確認する |
| 1 つのテストにアサーションが多すぎる | デバッグが難しい | 1 つのテストにつき、論理的なアサーションを 1 つにする |
| @Disabled のテストを放置する | 技術的負債が蓄積する | 無効化されたテストを修正するか削除する |
よくある問題の解決
| 問題 | 考えられる原因 | 解決策 |
|---|---|---|
| 「テストで NullPointerException が発生する」 | モックが注入されていない | @Mock と @InjectMocks のアノテーションを確認する |
| 「呼び出されるはずのメソッドが呼び出されていない」 | メソッドが呼び出されていない、または引数が誤っている | メソッド呼び出しを検証し、引数マッチャーを確認する |
| テストに時間がかかりすぎる | 不要な @SpringBootTest の使用 | 単体テストには Mockito を使用する |
| 「UnnecessaryStubbingException」 | モックをセットアップしたが使用していない | 未使用の when() ステートメントを削除する |
| 不安定なテスト | 状態の共有またはタイミング | セットアップを分離し、Thread.sleep を避ける |
| 「テストが見つからない」 | 命名規則が誤っている | test* 接頭辞または @Test アノテーションを使用する |
リファレンスドキュメント
コメント
Markdown 対応