langchain4j-testing-strategies
LangChain4jアプリケーション向けのユニットテスト・統合テスト・AIモックパターンを提供します。モックLLMレスポンスの作成、検索チェーンのテスト、RAGワークフローの検証、TestcontainersベースのJava AIサービス統合テストの実装が可能です。AIサービスのユニットテスト、LangChain4jコンポーネントの統合テスト、AIモデルのモック化、LLMベースのJavaアプリケーションのテストを行う際に使用してください。
description の原文を見る
Provides unit test, integration test, and mock AI patterns for LangChain4j applications. Creates mock LLM responses, tests retrieval chains, validates RAG workflows, and implements Testcontainers-based integration tests for Java AI services. Use when unit testing AI services, integration testing LangChain4j components, mocking AI models, or testing LLM-based Java applications.
SKILL.md 本文
LangChain4J Testing Strategies
Overview
LangChain4j の AI Services、RAG システム、ツール実行のためのユニットテスト、Testcontainers を使った統合テスト、エンドツーエンド検証のパターンです。
使用時機
- AI サービスのユニットテスト: LangChain4j AiServices を使用するサービスの高速で独立したテストが必要な場合
- LangChain4j コンポーネントの統合テスト: 実際の ChatModel、EmbeddingModel、RAG パイプラインを Testcontainers でテストする場合
- AI モデルのモック: 外部 API を呼び出さずに確定的なレスポンスが必要な場合
- LLM ベースの Java アプリケーションのテスト: RAG ワークフロー、ツール実行、取得チェーンを検証する場合
Instructions
1. モックを使用したユニットテスト
高速で独立したテストのためにモックモデルを使用します。references/unit-testing.md を参照してください。
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(any(String.class)))
.thenReturn(Response.from(AiMessage.from("Mocked response")));
var service = AiServices.builder(AiService.class)
.chatModel(mockModel)
.build();
2. テスト用の依存関係を設定
Maven/Gradle の依存関係をセットアップします。references/testing-dependencies.md を参照してください。
langchain4j-test- ガードレール アサーションtestcontainers- コンテナ化されたテストmockito- 外部依存関係のモックassertj- 流暢なアサーション
3. Testcontainers を使用した統合テスト
実際のサービスでテストします。references/integration-testing.md を参照してください。
@Testcontainers
class OllamaIntegrationTest {
@Container
static GenericContainer<?> ollama = new GenericContainer<>(
DockerImageName.parse("ollama/ollama:0.5.4")
).withExposedPorts(11434);
@Test
void shouldGenerateResponse() {
// コンテナのヘルスチェック
assertTrue(ollama.isRunning());
await().atMost(30, TimeUnit.SECONDS)
.until(() -> ollama.getLogs().contains("API server listening"));
ChatModel model = OllamaChatModel.builder()
.baseUrl(ollama.getEndpoint())
.build();
// テスト前にモデルがレスポンスすることを確認
assertDoesNotThrow(() -> model.generate("ping"));
String response = model.generate("Test query");
assertNotNull(response);
}
}
4. 高度な機能
ストリーミング、メモリ、エラーハンドリング パターンは references/advanced-testing.md に記載されています。
5. テスティング ワークフロー
references/workflow-patterns.md のテスト ピラミッドに従います:
- 70% ユニットテスト: モックを使用した高速で独立したテスト
- 20% 統合テスト: ヘルスチェック付きの実際のサービス
- 10% エンドツーエンドテスト: 完全なワークフロー
70% ユニットテスト ─ Mock ChatModel、ガードレール、エッジケース
20% 統合テスト ─ Testcontainers、ベクトルストア、RAG
10% エンドツーエンドテスト ─ 完全なユーザージャーニー
トラブルシューティング
- コンテナが起動しない: Docker デーモンが実行中であることを確認し、イメージが存在することを確認し、タイムアウトを増やします
- モデルが応答しない: baseUrl が正しいことを確認し、コンテナログをチェックし、モデルが読み込まれていることを確認します
- テストタイムアウト: 遅いモデルの場合は
@Timeout期間を増やし、コンテナのリソース制限を確認します - テストが不安定: アサーション前にリトライロジックまたはヘルスチェックを追加します
Examples
ユニットテスト
@Test
void shouldProcessQueryWithMock() {
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(any(String.class)))
.thenReturn(Response.from(AiMessage.from("Test response")));
var service = AiServices.builder(AiService.class)
.chatModel(mockModel)
.build();
String result = service.chat("What is Java?");
assertEquals("Test response", result);
}
Testcontainers を使用した統合テスト
@Testcontainers
class RAGIntegrationTest {
@Container
static GenericContainer<?> ollama = new GenericContainer<>(
DockerImageName.parse("ollama/ollama:0.5.4")
);
@BeforeAll
static void waitForContainerReady() {
await().atMost(60, TimeUnit.SECONDS)
.until(() -> ollama.getLogs().contains("API server listening"));
}
@Test
void shouldCompleteRAGWorkflow() {
assertTrue(ollama.isRunning());
var chatModel = OllamaChatModel.builder()
.baseUrl(ollama.getEndpoint())
.build();
var embeddingModel = OllamaEmbeddingModel.builder()
.baseUrl(ollama.getEndpoint())
.build();
var store = new InMemoryEmbeddingStore<>();
var retriever = EmbeddingStoreContentRetriever.builder()
.chatModel(chatModel)
.embeddingStore(store)
.embeddingModel(embeddingModel)
.build();
var assistant = AiServices.builder(RagAssistant.class)
.chatLanguageModel(chatModel)
.contentRetriever(retriever)
.build();
String response = assistant.chat("What is Spring Boot?");
assertNotNull(response);
assertTrue(response.contains("Spring"));
}
}
ベストプラクティス
- テスト分離のために
@BeforeEach/@AfterEachを使用 - ユニットテストで実際の API を呼び出さない。常にモックを使用
- 外部サービス呼び出しに
@Timeoutを含める - 成功とエラーハンドリングの両方のシナリオをテスト
- レスポンスの一貫性とエッジケースを検証
共通パターン
モック戦略
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(anyString())).thenReturn(Response.from(AiMessage.from("Mocked")));
when(mockModel.generate(eq("Hello"))).thenReturn(Response.from(AiMessage.from("Hi")));
when(mockModel.generate(contains("Java"))).thenReturn(Response.from(AiMessage.from("Java")));
アサーション ヘルパー
assertThat(response).isNotNull().isNotEmpty();
assertThat(response).containsAll(expectedKeywords);
assertThat(response).doesNotContain("error");
リファレンス ドキュメント
Testing Dependencies- Maven/Gradle 設定Unit Testing- モックモデル、ガードレールIntegration Testing- Testcontainers、実際のサービスAdvanced Testing- ストリーミング、メモリ、エラーハンドリングWorkflow Patterns- テスト ピラミッド、ベストプラクティス
制約と警告
- AI レスポンスは非決定論的。信頼性の高いユニットテストにはモックを使用
- テストでの実際の API 呼び出しを避け、コストとレート制限を防止
- 統合テストには Docker が必要。コンテナのヘルスチェックを使用
- RAG テストは適切にシードされたエンベディング ストアが必要
- モックベースのテストは実際の LLM の動作を保証できない。統合テストで補足
- テスト固有の設定プロファイルを使用。本番データに影響を与えない
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- giuseppe-trisciuoglio
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。