langchain4j-testing-strategies
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseLangChain4J Testing Strategies
LangChain4J 测试策略
When to Use This Skill
适用场景
Use this skill when:
- Building AI-powered applications with LangChain4J
- Writing unit tests for AI services and guardrails
- Setting up integration tests with real LLM models
- Creating mock-based tests for faster test execution
- Using Testcontainers for isolated testing environments
- Testing RAG (Retrieval-Augmented Generation) systems
- Validating tool execution and function calling
- Testing streaming responses and async operations
- Setting up end-to-end tests for AI workflows
- Implementing performance and load testing
在以下场景中使用本技能:
- 基于LangChain4J构建AI驱动的应用
- 为AI服务和防护机制编写单元测试
- 搭建与真实LLM模型结合的集成测试
- 创建基于Mock的测试以提升测试执行速度
- 使用Testcontainers搭建隔离测试环境
- 测试RAG(检索增强生成)系统
- 验证工具执行与函数调用
- 测试流式响应与异步操作
- 为AI工作流搭建端到端测试
- 实施性能与负载测试
Instructions
操作指南
To test LangChain4J applications effectively, follow these key strategies:
要高效测试LangChain4J应用,请遵循以下核心策略:
1. Start with Unit Testing
1. 从单元测试入手
Use mock models for fast, isolated testing of business logic. See for detailed examples.
references/unit-testing.mdjava
// Example: Mock ChatModel for unit tests
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();使用Mock模型对业务逻辑进行快速、隔离的测试。详细示例请参考。
references/unit-testing.mdjava
// Example: Mock ChatModel for unit tests
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. Configure Testing Dependencies
2. 配置测试依赖
Setup proper Maven/Gradle dependencies for testing. See for complete configuration.
references/testing-dependencies.mdKey dependencies:
- - Testing utilities and guardrail assertions
langchain4j-test - - Integration testing with containerized services
testcontainers - - Mock external dependencies
mockito - - Better assertions
assertj
为测试搭建合适的Maven/Gradle依赖。完整配置请参考。
references/testing-dependencies.md核心依赖:
- - 测试工具与防护机制断言
langchain4j-test - - 基于容器化服务的集成测试
testcontainers - - 模拟外部依赖
mockito - - 更易用的断言工具
assertj
3. Implement Integration Tests
3. 实施集成测试
Test with real services using Testcontainers. See for container setup examples.
references/integration-testing.mdjava
@Testcontainers
class OllamaIntegrationTest {
@Container
static GenericContainer<?> ollama = new GenericContainer<>(
DockerImageName.parse("ollama/ollama:latest")
).withExposedPorts(11434);
@Test
void shouldGenerateResponse() {
ChatModel model = OllamaChatModel.builder()
.baseUrl(ollama.getEndpoint())
.build();
String response = model.generate("Test query");
assertNotNull(response);
}
}使用Testcontainers测试真实服务。容器搭建示例请参考。
references/integration-testing.mdjava
@Testcontainers
class OllamaIntegrationTest {
@Container
static GenericContainer<?> ollama = new GenericContainer<>(
DockerImageName.parse("ollama/ollama:latest")
).withExposedPorts(11434);
@Test
void shouldGenerateResponse() {
ChatModel model = OllamaChatModel.builder()
.baseUrl(ollama.getEndpoint())
.build();
String response = model.generate("Test query");
assertNotNull(response);
}
}4. Test Advanced Features
4. 测试高级功能
For streaming responses, memory management, and complex workflows, refer to .
references/advanced-testing.md关于流式响应、内存管理与复杂工作流的测试,请参考。
references/advanced-testing.md5. Apply Testing Workflows
5. 应用测试工作流
Follow testing pyramid patterns and best practices from .
references/workflow-patterns.md- 70% Unit Tests: Fast, isolated business logic testing
- 20% Integration Tests: Real service interactions
- 10% End-to-End Tests: Complete user workflows
遵循中的测试金字塔模式与最佳实践。
references/workflow-patterns.md- 70% 单元测试:快速、隔离的业务逻辑测试
- 20% 集成测试:真实服务交互测试
- 10% 端到端测试:完整用户工作流测试
Examples
示例
Basic Unit Test
基础单元测试
java
@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);
}java
@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);
}Integration Test with Testcontainers
基于Testcontainers的集成测试
java
@Testcontainers
class RAGIntegrationTest {
@Container
static GenericContainer<?> ollama = new GenericContainer<>(
DockerImageName.parse("ollama/ollama:latest")
);
@Test
void shouldCompleteRAGWorkflow() {
// Setup models and stores
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();
// Test complete workflow
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"));
}
}java
@Testcontainers
class RAGIntegrationTest {
@Container
static GenericContainer<?> ollama = new GenericContainer<>(
DockerImageName.parse("ollama/ollama:latest")
);
@Test
void shouldCompleteRAGWorkflow() {
// Setup models and stores
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();
// Test complete workflow
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"));
}
}Best Practices
最佳实践
Test Isolation
测试隔离
- Each test must be independent
- Use and
@BeforeEachfor setup/teardown@AfterEach - Avoid sharing state between tests
- 每个测试必须独立
- 使用和
@BeforeEach进行前置/后置处理@AfterEach - 避免测试间共享状态
Mock External Dependencies
模拟外部依赖
- Never call real APIs in unit tests
- Use mocks for ChatModel, EmbeddingModel, and external services
- Test error handling scenarios
- 单元测试中绝不调用真实API
- 为ChatModel、EmbeddingModel及外部服务使用Mock
- 测试错误处理场景
Performance Considerations
性能考量
- Unit tests should run in < 50ms
- Integration tests should use container reuse
- Include timeout assertions for slow operations
- 单元测试执行时间应<50毫秒
- 集成测试应复用容器
- 为慢操作添加超时断言
Quality Assertions
质量断言
- Test both success and error scenarios
- Validate response coherence and relevance
- Include edge case testing (empty inputs, large payloads)
- 同时测试成功与错误场景
- 验证响应的连贯性与相关性
- 包含边界场景测试(空输入、大负载)
Reference Documentation
参考文档
For comprehensive testing guides and API references, see the included reference documents:
- Testing Dependencies - Maven/Gradle configuration and setup
- Unit Testing - Mock models, guardrails, and individual components
- Integration Testing - Testcontainers and real service testing
- Advanced Testing - Streaming, memory, and error handling
- Workflow Patterns - Test pyramid and best practices
如需全面的测试指南与API参考,请查看附带的参考文档:
- 测试依赖 - Maven/Gradle配置与搭建
- 单元测试 - Mock模型、防护机制与独立组件测试
- 集成测试 - Testcontainers与真实服务测试
- 高级测试 - 流式处理、内存管理与错误处理
- 工作流模式 - 测试金字塔与最佳实践
Common Patterns
常见模式
Mock Strategy
Mock策略
java
// For fast unit tests
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(anyString())).thenReturn(Response.from(AiMessage.from("Mocked")));
// For specific responses
when(mockModel.generate(eq("Hello"))).thenReturn(Response.from(AiMessage.from("Hi")));
when(mockModel.generate(contains("Java"))).thenReturn(Response.from(AiMessage.from("Java response")));java
// For fast unit tests
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(anyString())).thenReturn(Response.from(AiMessage.from("Mocked")));
// For specific responses
when(mockModel.generate(eq("Hello"))).thenReturn(Response.from(AiMessage.from("Hi")));
when(mockModel.generate(contains("Java"))).thenReturn(Response.from(AiMessage.from("Java response")));Test Configuration
测试配置
java
// Use test-specific profiles
@TestPropertySource(properties = {
"langchain4j.ollama.base-url=http://localhost:11434"
})
class TestConfig {
// Test with isolated configuration
}java
// Use test-specific profiles
@TestPropertySource(properties = {
"langchain4j.ollama.base-url=http://localhost:11434"
})
class TestConfig {
// Test with isolated configuration
}Assertion Helpers
断言工具
java
// Custom assertions for AI responses
assertThat(response).isNotNull().isNotEmpty();
assertThat(response).containsAll(expectedKeywords);
assertThat(response).doesNotContain("error");java
// Custom assertions for AI responses
assertThat(response).isNotNull().isNotEmpty();
assertThat(response).containsAll(expectedKeywords);
assertThat(response).doesNotContain("error");Performance Requirements
性能要求
- Unit Tests: < 50ms per test
- Integration Tests: Use container reuse for faster startup
- Timeout Tests: Include for external service calls
@Timeout - Memory Management: Test conversation window limits and cleanup
- 单元测试:每个测试执行时间<50毫秒
- 集成测试:复用容器以加快启动速度
- 超时测试:为外部服务调用添加
@Timeout - 内存管理:测试对话窗口限制与清理机制
Security Considerations
安全考量
- Never use real API keys in tests
- Mock external API calls completely
- Test prompt injection detection
- Validate output sanitization
- 测试中绝不使用真实API密钥
- 完全模拟外部API调用
- 测试提示注入检测机制
- 验证输出清理逻辑
Testing Pyramid Implementation
测试金字塔实施
70% Unit Tests
├─ Business logic validation
├─ Guardrail testing
├─ Mock tool execution
└─ Edge case handling
20% Integration Tests
├─ Testcontainers with Ollama
├─ Vector store testing
├─ RAG workflow validation
└─ Performance benchmarking
10% End-to-End Tests
├─ Complete user journeys
├─ Real model interactions
└─ Performance under load70% 单元测试
├─ 业务逻辑验证
├─ 防护机制测试
├─ Mock工具执行
└─ 边界场景处理
20% 集成测试
├─ 基于Testcontainers的Ollama测试
├─ 向量存储测试
├─ RAG工作流验证
└─ 性能基准测试
10% 端到端测试
├─ 完整用户流程
├─ 真实模型交互
└─ 负载下的性能测试Related Skills
相关技能
spring-boot-test-patternsunit-test-service-layerunit-test-boundary-conditions
spring-boot-test-patternsunit-test-service-layerunit-test-boundary-conditions
References
参考链接
- Testing Dependencies
- Unit Testing
- Integration Testing
- Advanced Testing
- Workflow Patterns
- 测试依赖
- 单元测试
- 集成测试
- 高级测试
- 工作流模式