1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockitousage.verification;
6
7import org.junit.Test;
8import org.mockito.Mock;
9import org.mockito.exceptions.base.MockitoAssertionError;
10import org.mockito.internal.invocation.InvocationMatcher;
11import org.mockito.internal.verification.api.VerificationData;
12import org.mockito.invocation.Invocation;
13import org.mockito.verification.VerificationMode;
14import org.mockitousage.IMethods;
15import org.mockitoutil.TestBase;
16
17import static junit.framework.TestCase.fail;
18import static org.mockito.Mockito.verify;
19
20public class CustomVerificationTest extends TestBase {
21
22    @Mock IMethods mock;
23
24    @Test
25    public void custom_verification_with_old_api() {
26        //given:
27        mock.simpleMethod("a", 10);
28
29        //expect:
30        verify(mock, ignoreParametersUsingOldApi()).simpleMethod();
31
32        try {
33            verify(mock, ignoreParametersUsingOldApi()).otherMethod();
34            fail();
35        } catch (MockitoAssertionError e) {}
36    }
37
38    //Old api still supported, see https://github.com/mockito/mockito/issues/730
39    private VerificationMode ignoreParametersUsingOldApi() {
40        return new VerificationMode() {
41            public void verify(VerificationData data) {
42                //use old api
43                InvocationMatcher target = data.getWanted();
44
45                //sanity check the new api
46                if (data.getTarget() != target) {
47                    throw new RuntimeException("Sanity check");
48                }
49
50                //look for the relevant invocation and exit if found
51                for (Invocation invocation : data.getAllInvocations()) {
52                    if (target.getInvocation().getMethod().getName().equals(invocation.getMethod().getName())) {
53                        return;
54                    }
55                }
56
57                //verification failed!
58                throw new MockitoAssertionError("Expected method with name: " + target + " not found in:\n" + data.getAllInvocations());
59            }
60            public VerificationMode description(String description) {
61                return this;
62            }
63        };
64    }
65}
66