import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class CalculatorTest {
static class Calculator {
public int add(int a, int b) {
return a + b;
}
public int multiply(int a, int b) {
return a * b;
}
}
@Spy
Calculator calculator;
@Test
void testPartialMockingWithSpy() {
// Stub multiply method to always return 100
when(calculator.multiply(anyInt(), anyInt())).thenReturn(100);
// Call add method - real method should be called
int sum = calculator.add(5, 3);
// Call multiply method - stubbed method should be called
int product = calculator.multiply(5, 3);
// Verify results
assertEquals(8, sum, "Add method should return real sum");
assertEquals(100, product, "Multiply method should return stubbed value");
}
}This test class uses @ExtendWith(MockitoExtension.class) to enable Mockito annotations.
The Calculator class has two methods: add and multiply.
We annotate a Calculator instance with @Spy to create a partial mock. This means real methods are called unless stubbed.
We stub the multiply method to always return 100 regardless of input using when(...).thenReturn(...).
When calling add(5,3), the real method runs and returns 8.
When calling multiply(5,3), the stubbed method runs and returns 100.
Assertions verify these expected results, confirming partial mocking works as intended.