mocking-test-generator
Mocking Test Generator
Generate unit tests with proper mocking of external dependencies for Python and Java code.
Workflow
- Analyze the code - Identify external dependencies, side effects, and testable units
- Select framework - Determine Python (unittest.mock/pytest) or Java (Mockito/JUnit)
- Generate mocks - Create mock objects for external dependencies
- Write tests - Generate executable test code with assertions
- Add documentation - Include clear comments explaining mocks and test logic
Step 1: Analyze the Code
Read the target code to identify:
- External dependencies: API clients, database connections, third-party libraries
- I/O operations: File reads/writes, network requests, system calls
- Side effects: Email sending, logging, state modifications
- Testable units: Functions, methods, or classes to test in isolation
Ask clarifying questions if:
- Multiple functions/classes exist (which to test?)
- Testing scope is unclear (unit vs integration?)
- Mock behavior needs specification (return values, exceptions?)
Step 2: Select Framework
Python: Use unittest.mock with pytest or unittest
- Prefer
@patchdecorator for external calls - Use
Mock()objects for complex dependencies - Apply
pytest.fixturefor reusable mocks
Java: Use Mockito with JUnit 5
- Use
@Mockannotation for dependencies - Apply
@ExtendWith(MockitoExtension.class)to test class - Use
when().thenReturn()for stubbing
Step 3: Generate Mocks
Identify what to mock:
Always mock:
- External API calls (HTTP requests, REST clients)
- Database connections and queries
- File system operations
- Network I/O
- Time/date functions
- Random number generators
- Environment variables
Never mock (unless explicitly requested):
- Internal business logic
- Pure functions
- Data structures
- Simple utilities
For common patterns, reference:
- Python: See references/python_patterns.md
- Java: See references/java_patterns.md
Step 4: Write Tests
Generate test code that:
- Imports - Include necessary testing and mocking libraries
- Setup - Initialize mocks and test fixtures
- Execution - Call the function/method under test
- Assertions - Verify expected behavior and outputs
- Verification - Confirm mocks were called correctly
Test structure:
# Python example
from unittest.mock import patch, Mock
import pytest
@patch('module.external_dependency')
def test_function_name(mock_dependency):
# Arrange: Setup mock behavior
mock_dependency.return_value = expected_value
# Act: Execute function under test
result = function_under_test(input_data)
# Assert: Verify results
assert result == expected_output
mock_dependency.assert_called_once_with(expected_args)
// Java example
@ExtendWith(MockitoExtension.class)
class ServiceTest {
@Mock
private ExternalDependency dependency;
@Test
void testMethodName() {
// Arrange: Setup mock behavior
when(dependency.method()).thenReturn(expectedValue);
// Act: Execute method under test
Service service = new Service(dependency);
String result = service.methodUnderTest();
// Assert: Verify results
assertEquals(expectedOutput, result);
verify(dependency).method();
}
}
Include:
- Multiple test cases for different scenarios (happy path, edge cases, errors)
- Descriptive test names that explain what is being tested
- Setup/teardown if needed for test isolation
Step 5: Add Documentation
Include comments that explain:
- What external dependency is being mocked and why
- What behavior the mock simulates
- What the test verifies
Keep comments concise and focused on non-obvious aspects.
Output Format
Provide:
- Complete test file - Fully executable with all imports
- Test class/module - Properly structured for the framework
- Multiple test methods - Cover main scenarios
- Clear naming - Descriptive test and variable names
Do not:
- Modify the original code under test
- Mock internal logic unless explicitly requested
- Generate incomplete or pseudo-code tests
Example Usage
User request: "Generate unit tests for this Python function that calls an external API"
Response:
- Read the function code
- Identify the API call to mock
- Generate pytest test file with
@patchdecorator - Include tests for success case, error handling, and edge cases
- Add comments explaining the mock setup
Framework-Specific Notes
Python (pytest):
- Use
@pytest.fixturefor reusable mock setups - Apply
@patchas decorator or context manager - Use
mock_openfor file operations - Apply
@patch.dictfor environment variables
Python (unittest):
- Use
unittest.TestCasebase class - Apply
@patchdecorator orpatch()context manager - Use
setUp()andtearDown()methods - Call
self.assert*methods
Java (Mockito + JUnit 5):
- Use
@ExtendWith(MockitoExtension.class)on test class - Apply
@Mockfor dependencies - Use
@BeforeEachfor setup,@AfterEachfor teardown - Apply
ArgumentCaptorto verify complex arguments - Use
MockedStaticfor static method mocking (Mockito 3.4+)
Common Patterns
Reference files contain detailed examples for:
Python (references/python_patterns.md):
- External API calls
- Database operations
- File system operations
- Environment variables
- Time-dependent code
- Exception handling
Java (references/java_patterns.md):
- External API calls
- Database operations
- File system operations
- Void methods
- Exception handling
- Argument captors
- Static method mocking
- Constructor mocking