CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-mockito--mockito-all

A comprehensive Java mocking framework that enables developers to create test doubles for unit testing.

Pending
Overview
Eval results
Files

verification.mddocs/

Verification and Interaction Testing

Verification in Mockito allows you to check that mock methods were called with expected arguments and frequencies. This is essential for testing interactions between objects.

Basic Verification

Simple Verification

Verify that a method was called:

public static <T> T verify(T mock);
public static <T> T verify(T mock, VerificationMode mode);

Usage Examples:

List<String> mock = mock(List.class);

// Use the mock
mock.add("item");
mock.clear();

// Verify interactions
verify(mock).add("item");
verify(mock).clear();
verify(mock).add(eq("item")); // Using argument matchers

Verification Modes

Control how many times a method should be called:

public static VerificationMode times(int wantedNumberOfInvocations);
public static VerificationMode never();
public static VerificationMode atLeastOnce();
public static VerificationMode atLeast(int minNumberOfInvocations);
public static VerificationMode atMost(int maxNumberOfInvocations);
public static VerificationMode only();

Usage Examples:

List<String> mock = mock(List.class);

// Call method multiple times
mock.add("item1");
mock.add("item2");
mock.add("item3");

// Verify exact number of calls
verify(mock, times(3)).add(anyString());
verify(mock, times(1)).add("item1");

// Verify never called
verify(mock, never()).remove(anyString());

// Verify at least once
verify(mock, atLeastOnce()).add(anyString());

// Verify minimum number of calls
verify(mock, atLeast(2)).add(anyString());

// Verify maximum number of calls
verify(mock, atMost(5)).add(anyString());

// Verify this was the only interaction
verify(mock, only()).add(anyString());

Times Alias

public static VerificationMode calls(int wantedNumberOfInvocations);

This is an alias for times():

verify(mock, calls(3)).add(anyString());
// Equivalent to: verify(mock, times(3)).add(anyString());

No Interactions Verification

Verify that no interactions occurred:

public static void verifyNoMoreInteractions(Object... mocks);
public static void verifyZeroInteractions(Object... mocks);

Usage Examples:

List<String> mock1 = mock(List.class);
List<String> mock2 = mock(List.class);

// Use mock1 but not mock2
mock1.add("item");

// Verify no interactions with mock2
verifyZeroInteractions(mock2);

// Verify mock1 had only the expected interaction
verify(mock1).add("item");
verifyNoMoreInteractions(mock1);

// Verify multiple mocks
verifyNoMoreInteractions(mock1, mock2);

Ordered Verification

Verify that interactions happened in a specific order:

public static InOrder inOrder(Object... mocks);

public interface InOrder {
    <T> T verify(T mock);
    <T> T verify(T mock, VerificationMode mode);
    void verifyNoMoreInteractions();
}

Usage Examples:

List<String> firstMock = mock(List.class);
List<String> secondMock = mock(List.class);

// Use mocks in specific order
firstMock.add("first");
secondMock.add("second");
firstMock.add("third");

// Verify order
InOrder inOrder = inOrder(firstMock, secondMock);
inOrder.verify(firstMock).add("first");
inOrder.verify(secondMock).add("second");
inOrder.verify(firstMock).add("third");

// Verify no more interactions in order
inOrder.verifyNoMoreInteractions();

Timeout Verification

Verify interactions with timeout for asynchronous testing:

public static VerificationWithTimeout timeout(long millis);
public static VerificationAfterDelay after(int millis);

Usage Examples:

// Verify within timeout period
verify(mock, timeout(1000)).add("item");

// Verify with exact timeout
verify(mock, timeout(1000).times(1)).add("item");

// Verify after delay
verify(mock, after(100)).add("item");

// Combined with other modes
verify(mock, timeout(1000).atLeast(2)).add(anyString());

Ignoring Stubs

Verify only interactions, not stubs:

public static Object[] ignoreStubs(Object... mocks);

Usage Examples:

List<String> mock = mock(List.class);

// Stub method
when(mock.get(0)).thenReturn("item");

// Use mock
mock.get(0); // This is stubbing interaction
mock.add("new item"); // This is real interaction

// Verify only real interactions, ignore stubs
verify(mock).add("new item");
verifyNoMoreInteractions(ignoreStubs(mock));

Argument Verification

Verify method calls with specific argument values:

List<String> mock = mock(List.class);

mock.add("exact string");
mock.add("another string");

// Verify exact arguments
verify(mock).add("exact string");

// Verify with argument matchers
verify(mock, times(2)).add(anyString());
verify(mock).add(startsWith("exact"));
verify(mock).add(contains("string"));

// Verify with custom matchers
verify(mock).add(argThat(s -> s.length() > 5));

Verification Best Practices

Verify Behavior, Not Implementation

// Good - verify important interactions
verify(emailService).sendEmail(user.getEmail(), "Welcome!");

// Avoid - over-verification of internal details
verify(mock, times(1)).toString(); // Usually not important

Use Appropriate Verification Modes

// Good - verify expected behavior
verify(service, times(1)).processPayment(payment);

// Good - verify it never happens in error cases
verify(emailService, never()).sendEmail(anyString(), anyString());

// Avoid - over-specific verification
verify(service, times(1)).log(anyString()); // Logging is often implementation detail

Combine with Argument Captors

ArgumentCaptor<String> emailCaptor = ArgumentCaptor.forClass(String.class);
verify(emailService).sendEmail(emailCaptor.capture(), anyString());
assertEquals("user@example.com", emailCaptor.getValue());

Order Verification Guidelines

// Good - verify order when it matters
InOrder inOrder = inOrder(database, cache);
inOrder.verify(database).save(entity);
inOrder.verify(cache).invalidate(entity.getId());

// Avoid - unnecessary order verification
InOrder inOrder = inOrder(service1, service2);
inOrder.verify(service1).method1(); // If order doesn't matter for correctness
inOrder.verify(service2).method2();

Common Verification Errors

WantedButNotInvoked

List<String> mock = mock(List.class);
verify(mock).add("item"); // Throws WantedButNotInvoked - method never called

TooManyActualInvocations

List<String> mock = mock(List.class);
mock.add("item");
mock.add("item");
verify(mock, times(1)).add("item"); // Throws TooManyActualInvocations

ArgumentsAreDifferent

List<String> mock = mock(List.class);
mock.add("actual");
verify(mock).add("expected"); // Throws ArgumentsAreDifferent

Never but Invoked

List<String> mock = mock(List.class);
mock.clear();
verify(mock, never()).clear(); // Throws NeverWantedButInvoked

Advanced Verification Patterns

Verification with Custom Matchers

verify(service).process(argThat(request -> 
    request.getId() > 0 && request.getName() != null));

Verification in Loops

for (int i = 0; i < 3; i++) {
    verify(mock).process(eq(i));
}

Conditional Verification

if (condition) {
    verify(service).performAction();
} else {
    verify(service, never()).performAction();
}

Install with Tessl CLI

npx tessl i tessl/maven-org-mockito--mockito-all

docs

annotations.md

argument-capturing.md

bdd-testing.md

index.md

junit-integration.md

matchers.md

mock-creation.md

stubbing.md

verification.md

tile.json