1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.exceptions;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.base.MockitoAssertionError;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.base.MockitoException;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.misusing.*;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.verification.*;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.debugging.LocationImpl;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.exceptions.VerificationAwareInvocation;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.exceptions.util.ScenarioPrinter;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.junit.JUnitTool;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.matchers.LocalizedMatcher;
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.MockUtil;
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.StringJoiner;
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.DescribedInvocation;
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Invocation;
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.InvocationOnMock;
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Location;
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.listeners.InvocationListener;
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Field;
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.ArrayList;
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Collection;
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.List;
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport static org.mockito.internal.reporting.Pluralizer.pluralize;
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport static org.mockito.internal.util.StringJoiner.join;
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Reports verification and misusing errors.
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * One of the key points of mocking library is proper verification/exception
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * messages. All messages in one place makes it easier to tune and amend them.
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Reporter can be injected and therefore is easily testable.
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Generally, exception messages are full of line breaks to make them easy to
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * read (xunit plugins take only fraction of screen on modern IDEs).
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class Reporter {
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void checkedExceptionInvalid(Throwable t) {
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Checked exception is invalid for this method!",
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Invalid: " + t
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotStubWithNullThrowable() {
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Cannot stub with null throwable!"
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void unfinishedStubbing(Location location) {
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new UnfinishedStubbingException(join(
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Unfinished stubbing detected here:",
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                location,
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "E.g. thenReturn() may be missing.",
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct stubbing:",
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    when(mock.isOk()).thenReturn(true);",
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    when(mock.isOk()).thenThrow(exception);",
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doThrow(exception).when(mock).someVoidMethod();",
70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Hints:",
71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                " 1. missing thenReturn()",
72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                " 2. you are trying to stub a final method, you naughty developer!",
73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void incorrectUseOfApi() {
78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Incorrect use of API detected here:",
80e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
81e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
82e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You probably stored a reference to OngoingStubbing returned by when() and called stubbing methods like thenReturn() on this reference more than once.",
83e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct usage:",
84e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    when(mock.isOk()).thenReturn(true).thenReturn(false).thenThrow(exception);",
85e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    when(mock.isOk()).thenReturn(true, false).thenThrow(exception);",
86e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
87e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
88e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
89e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
90e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void missingMethodInvocation() {
91e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MissingMethodInvocationException(join(
92e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "when() requires an argument which has to be 'a method call on a mock'.",
93e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
94e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    when(mock.getArticles()).thenReturn(articles);",
95e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
96e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also, this error might show up because:",
97e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "1. you stub either of: final/private/equals()/hashCode() methods.",
98e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   Those methods *cannot* be stubbed/verified.",
99e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "2. inside when() you don't call method on mock but on some other object.",
100e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "3. the parent of the mocked class is not public.",
101e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   It is a limitation of the mock engine.",
102e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
103e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
104e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
105e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
106e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void unfinishedVerificationException(Location location) {
107e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        UnfinishedVerificationException exception = new UnfinishedVerificationException(join(
108e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Missing method call for verify(mock) here:",
109e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                location,
110e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
111e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Example of correct verification:",
112e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock).doSomething()",
113e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
114e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.",
115e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Those methods *cannot* be stubbed/verified.",
116e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
117e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
118e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
119e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw exception;
120e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
121e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
122e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void notAMockPassedToVerify(Class type) {
123e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NotAMockException(join(
124e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument passed to verify() is of type " + type.getSimpleName() + " and is not a mock!",
125e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Make sure you place the parenthesis correctly!",
126e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "See the examples of correct verifications:",
127e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock).someMethod();",
128e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock, times(10)).someMethod();",
129e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock, atLeastOnce()).someMethod();"
130e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
131e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
132e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
133e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void nullPassedToVerify() {
134e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NullInsteadOfMockException(join(
135e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument passed to verify() should be a mock but is null!",
136e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct verifications:",
137e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock).someMethod();",
138e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock, times(10)).someMethod();",
139e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock, atLeastOnce()).someMethod();",
140e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also, if you use @Mock annotation don't miss initMocks()"
141e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
142e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
143e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
144e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void notAMockPassedToWhenMethod() {
145e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NotAMockException(join(
146e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument passed to when() is not a mock!",
147e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Example of correct stubbing:",
148e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doThrow(new RuntimeException()).when(mock).someMethod();"
149e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
150e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
151e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
152e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void nullPassedToWhenMethod() {
153e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NullInsteadOfMockException(join(
154e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument passed to when() is null!",
155e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Example of correct stubbing:",
156e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doThrow(new RuntimeException()).when(mock).someMethod();",
157e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also, if you use @Mock annotation don't miss initMocks()"
158e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
159e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
160e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
161e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void mocksHaveToBePassedToVerifyNoMoreInteractions() {
162e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
163e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Method requires argument(s)!",
164e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Pass mocks that should be verified, e.g:",
165e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verifyNoMoreInteractions(mockOne, mockTwo);",
166e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verifyZeroInteractions(mockOne, mockTwo);",
167e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
168e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
169e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
170e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
171e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void notAMockPassedToVerifyNoMoreInteractions() {
172e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NotAMockException(join(
173e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument(s) passed is not a mock!",
174e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct verifications:",
175e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verifyNoMoreInteractions(mockOne, mockTwo);",
176e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verifyZeroInteractions(mockOne, mockTwo);",
177e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
178e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
179e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
180e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
181e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void nullPassedToVerifyNoMoreInteractions() {
182e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NullInsteadOfMockException(join(
183e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument(s) passed is null!",
184e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct verifications:",
185e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verifyNoMoreInteractions(mockOne, mockTwo);",
186e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verifyZeroInteractions(mockOne, mockTwo);"
187e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
188e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
189e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
190e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void notAMockPassedWhenCreatingInOrder() {
191e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NotAMockException(join(
192e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument(s) passed is not a mock!",
193e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Pass mocks that require verification in order.",
194e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
195e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    InOrder inOrder = inOrder(mockOne, mockTwo);"
196e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
197e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
198e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
199e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void nullPassedWhenCreatingInOrder() {
200e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NullInsteadOfMockException(join(
201e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument(s) passed is null!",
202e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Pass mocks that require verification in order.",
203e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
204e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    InOrder inOrder = inOrder(mockOne, mockTwo);"
205e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
206e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
207e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
208e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void mocksHaveToBePassedWhenCreatingInOrder() {
209e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
210e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Method requires argument(s)!",
211e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Pass mocks that require verification in order.",
212e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
213e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    InOrder inOrder = inOrder(mockOne, mockTwo);"
214e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
215e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
216e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
217e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void inOrderRequiresFamiliarMock() {
218e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
219e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "InOrder can only verify mocks that were passed in during creation of InOrder.",
220e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
221e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    InOrder inOrder = inOrder(mockOne);",
222e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    inOrder.verify(mockOne).doStuff();"
223e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
224e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
225e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
226e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void invalidUseOfMatchers(int expectedMatchersCount, List<LocalizedMatcher> recordedMatchers) {
227e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new InvalidUseOfMatchersException(join(
228e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Invalid use of argument matchers!",
229e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                expectedMatchersCount + " matchers expected, " + recordedMatchers.size()+ " recorded:" +
230e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        locationsOf(recordedMatchers),
231e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
232e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "This exception may occur if matchers are combined with raw values:",
233e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    //incorrect:",
234e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    someMethod(anyObject(), \"raw String\");",
235e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "When using matchers, all arguments have to be provided by matchers.",
236e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
237e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    //correct:",
238e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    someMethod(anyObject(), eq(\"String by matcher\"));",
239e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
240e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For more info see javadoc for Matchers class.",
241e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
242e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
243e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
244e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
245e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void incorrectUseOfAdditionalMatchers(String additionalMatcherName, int expectedSubMatchersCount, Collection<LocalizedMatcher> matcherStack) {
246e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new InvalidUseOfMatchersException(join(
247e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Invalid use of argument matchers inside additional matcher " + additionalMatcherName + " !",
248e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
249e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
250e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                expectedSubMatchersCount + " sub matchers expected, " + matcherStack.size() + " recorded:",
251e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                locationsOf(matcherStack),
252e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
253e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "This exception may occur if matchers are combined with raw values:",
254e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    //incorrect:",
255e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    someMethod(AdditionalMatchers.and(isNotNull(), \"raw String\");",
256e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "When using matchers, all arguments have to be provided by matchers.",
257e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For example:",
258e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    //correct:",
259e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    someMethod(AdditionalMatchers.and(isNotNull(), eq(\"raw String\"));",
260e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
261e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For more info see javadoc for Matchers and AdditionalMatchers classes.",
262e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
263e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
264e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
265e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
266e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void stubPassedToVerify() {
267e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new CannotVerifyStubOnlyMock(join(
268e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Argument passed to verify() is a stubOnly() mock, not a full blown mock!",
269e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "If you intend to verify invocations on a mock, don't use stubOnly() in its MockSettings."
270e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
271e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
272e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
273e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void reportNoSubMatchersFound(String additionalMatcherName) {
274e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new InvalidUseOfMatchersException(join(
275e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "No matchers found for additional matcher " + additionalMatcherName,
276e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
277e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
278e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
279e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
280e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
281e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
282e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private Object locationsOf(Collection<LocalizedMatcher> matchers) {
283e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        List<String> description = new ArrayList<String>();
284e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        for (LocalizedMatcher matcher : matchers)
285e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            description.add(matcher.getLocation().toString());
286e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return join(description.toArray());
287e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
288e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
289e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void argumentsAreDifferent(String wanted, String actual, Location actualLocation) {
290e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = join("Argument(s) are different! Wanted:",
291e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                wanted,
292e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
293e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Actual invocation has different arguments:",
294e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                actual,
295e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                actualLocation,
296e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
297e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        );
298e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
299e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (JUnitTool.hasJUnit()) {
300e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw JUnitTool.createArgumentsAreDifferentException(message, wanted, actual);
301e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } else {
302e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw new ArgumentsAreDifferent(message);
303e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
304e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
305e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
306e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void wantedButNotInvoked(DescribedInvocation wanted) {
307e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new WantedButNotInvoked(createWantedButNotInvokedMessage(wanted));
308e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
309e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
310e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void wantedButNotInvoked(DescribedInvocation wanted, List<? extends DescribedInvocation> invocations) {
311e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String allInvocations;
312e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (invocations.isEmpty()) {
313e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            allInvocations = "Actually, there were zero interactions with this mock.\n";
314e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } else {
315e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            StringBuilder sb = new StringBuilder("\nHowever, there were other interactions with this mock:\n");
316e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            for (DescribedInvocation i : invocations) {
317e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                sb.append(i.toString())
318e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        .append("\n")
319e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        .append(i.getLocation())
320e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        .append("\n\n");
321e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
322e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            allInvocations = sb.toString();
323e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
324e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
325e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = createWantedButNotInvokedMessage(wanted);
326e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new WantedButNotInvoked(message + allInvocations);
327e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
328e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
329e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private String createWantedButNotInvokedMessage(DescribedInvocation wanted) {
330e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return join(
331e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Wanted but not invoked:",
332e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                wanted.toString(),
333e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
334e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
335e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        );
336e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
337e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
338e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void wantedButNotInvokedInOrder(DescribedInvocation wanted, DescribedInvocation previous) {
339e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new VerificationInOrderFailure(join(
340e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Verification in order failure",
341e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Wanted but not invoked:",
342e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                wanted.toString(),
343e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
344e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Wanted anywhere AFTER following interaction:",
345e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                previous.toString(),
346e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                previous.getLocation(),
347e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
348e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
349e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
350e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
351e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void tooManyActualInvocations(int wantedCount, int actualCount, DescribedInvocation wanted, Location firstUndesired) {
352e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = createTooManyInvocationsMessage(wantedCount, actualCount, wanted, firstUndesired);
353e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new TooManyActualInvocations(message);
354e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
355e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
356e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private String createTooManyInvocationsMessage(int wantedCount, int actualCount, DescribedInvocation wanted,
357e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                                                   Location firstUndesired) {
358e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return join(
359e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                wanted.toString(),
360e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Wanted " + pluralize(wantedCount) + ":",
361e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
362e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "But was " + pluralize(actualCount) + ". Undesired invocation:",
363e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                firstUndesired,
364e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
365e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        );
366e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
367e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
368e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void neverWantedButInvoked(DescribedInvocation wanted, Location firstUndesired) {
369e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NeverWantedButInvoked(join(
370e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                wanted.toString(),
371e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Never wanted here:",
372e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
373e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "But invoked here:",
374e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                firstUndesired,
375e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
376e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
377e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
378e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
379e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void tooManyActualInvocationsInOrder(int wantedCount, int actualCount, DescribedInvocation wanted, Location firstUndesired) {
380e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = createTooManyInvocationsMessage(wantedCount, actualCount, wanted, firstUndesired);
381e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new VerificationInOrderFailure(join(
382e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Verification in order failure:" + message
383e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
384e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
385e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
386e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private String createTooLittleInvocationsMessage(org.mockito.internal.reporting.Discrepancy discrepancy, DescribedInvocation wanted,
387e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                                                     Location lastActualInvocation) {
388e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String ending =
389e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                (lastActualInvocation != null)? lastActualInvocation + "\n" : "\n";
390e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
391e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = join(
392e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                wanted.toString(),
393e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Wanted " + discrepancy.getPluralizedWantedCount() + ":",
394e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
395e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "But was " + discrepancy.getPluralizedActualCount() + ":",
396e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ending
397e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        );
398e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return message;
399e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
400e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
401e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void tooLittleActualInvocations(org.mockito.internal.reporting.Discrepancy discrepancy, DescribedInvocation wanted, Location lastActualLocation) {
402e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = createTooLittleInvocationsMessage(discrepancy, wanted, lastActualLocation);
403e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
404e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new TooLittleActualInvocations(message);
405e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
406e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
407e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void tooLittleActualInvocationsInOrder(org.mockito.internal.reporting.Discrepancy discrepancy, DescribedInvocation wanted, Location lastActualLocation) {
408e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String message = createTooLittleInvocationsMessage(discrepancy, wanted, lastActualLocation);
409e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
410e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new VerificationInOrderFailure(join(
411e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Verification in order failure:" + message
412e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
413e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
414e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
415e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void noMoreInteractionsWanted(Invocation undesired, List<VerificationAwareInvocation> invocations) {
416e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ScenarioPrinter scenarioPrinter = new ScenarioPrinter();
417e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String scenario = scenarioPrinter.print(invocations);
418e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
419e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new NoInteractionsWanted(join(
420e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "No interactions wanted here:",
421e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
422e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "But found this interaction:",
423e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                undesired.getLocation(),
424e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                scenario
425e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
426e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
427e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
428e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void noMoreInteractionsWantedInOrder(Invocation undesired) {
429e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new VerificationInOrderFailure(join(
430e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "No interactions wanted here:",
431e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
432e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "But found this interaction:",
433e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                undesired.getLocation(),
434e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
435e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
436e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
437e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
438e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotMockFinalClass(Class<?> clazz) {
439e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
440e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Cannot mock/spy " + clazz.toString(),
441e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mockito cannot mock/spy following:",
442e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  - final classes",
443e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  - anonymous classes",
444e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  - primitive types"
445e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
446e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
447e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
448e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotStubVoidMethodWithAReturnValue(String methodName) {
449e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
450e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "'" + methodName + "' is a *void method* and it *cannot* be stubbed with a *return value*!",
451e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Voids are usually stubbed with Throwables:",
452e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doThrow(exception).when(mock).someVoidMethod();",
453e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "***",
454e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "If you're unsure why you're getting above error read on.",
455e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Due to the nature of the syntax above problem might occur because:",
456e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "1. The method you are trying to stub is *overloaded*. Make sure you are calling the right overloaded version.",
457e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "2. Somewhere in your test you are stubbing *final methods*. Sorry, Mockito does not verify/stub final methods.",
458e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "3. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies - ",
459e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   - with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.",
460e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
461e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
462e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
463e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
464e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void onlyVoidMethodsCanBeSetToDoNothing() {
465e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
466e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Only void methods can doNothing()!",
467e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Example of correct use of doNothing():",
468e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doNothing().",
469e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doThrow(new RuntimeException())",
470e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    .when(mock).someVoidMethod();",
471e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Above means:",
472e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called"
473e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
474e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
475e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
476e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void wrongTypeOfReturnValue(String expectedType, String actualType, String methodName) {
477e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new WrongTypeOfReturnValue(join(
478e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                actualType + " cannot be returned by " + methodName + "()",
479e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                methodName + "() should return " + expectedType,
480e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "***",
481e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "If you're unsure why you're getting above error read on.",
482e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Due to the nature of the syntax above problem might occur because:",
483e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "1. This exception *might* occur in wrongly written multi-threaded tests.",
484e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   Please refer to Mockito FAQ on limitations of concurrency testing.",
485e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies - ",
486e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   - with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.",
487e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
488e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
489e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
490e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
491e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void wantedAtMostX(int maxNumberOfInvocations, int foundSize) {
492e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoAssertionError(join("Wanted at most " + pluralize(maxNumberOfInvocations) + " but was " + foundSize));
493e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
494e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
495e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void misplacedArgumentMatcher(List<LocalizedMatcher> lastMatchers) {
496e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new InvalidUseOfMatchersException(join(
497e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Misplaced argument matcher detected here:",
498e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                locationsOf(lastMatchers),
499e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
500e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You cannot use argument matchers outside of verification or stubbing.",
501e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct usage of argument matchers:",
502e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    when(mock.get(anyInt())).thenReturn(null);",
503e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());",
504e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock).someMethod(contains(\"foo\"))",
505e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
506e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also, this error might show up because you use argument matchers with methods that cannot be mocked.",
507e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().",
508e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
509e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
510e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
511e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
512e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void smartNullPointerException(String invocation, Location location) {
513e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new SmartNullPointerException(join(
514e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You have a NullPointerException here:",
515e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new LocationImpl(),
516e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "because this method call was *not* stubbed correctly:",
517e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                location,
518e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                invocation,
519e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
520e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
521e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
522e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
523e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void noArgumentValueWasCaptured() {
524e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
525e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "No argument value was captured!",
526e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You might have forgotten to use argument.capture() in verify()...",
527e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "...or you used capture() in stubbing but stubbed method was not called.",
528e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Be aware that it is recommended to use capture() only with verify()",
529e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
530e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct argument capturing:",
531e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);",
532e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    verify(mock).doSomething(argument.capture());",
533e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "    assertEquals(\"John\", argument.getValue().getName());",
534e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
535e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
536e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
537e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
538e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void extraInterfacesDoesNotAcceptNullParameters() {
539e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
540e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "extraInterfaces() does not accept null parameters."
541e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
542e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
543e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
544e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void extraInterfacesAcceptsOnlyInterfaces(Class<?> wrongType) {
545e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
546e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "extraInterfaces() accepts only interfaces.",
547e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You passed following type: " + wrongType.getSimpleName() + " which is not an interface."
548e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
549e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
550e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
551e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void extraInterfacesCannotContainMockedType(Class<?> wrongType) {
552e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
553e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "extraInterfaces() does not accept the same type as the mocked type.",
554e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You mocked following type: " + wrongType.getSimpleName(),
555e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "and you passed the same very interface to the extraInterfaces()"
556e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
557e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
558e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
559e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void extraInterfacesRequiresAtLeastOneInterface() {
560e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
561e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "extraInterfaces() requires at least one interface."
562e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
563e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
564e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
565e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void mockedTypeIsInconsistentWithSpiedInstanceType(Class<?> mockedType, Object spiedInstance) {
566e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
567e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mocked type must be the same as the type of your spied instance.",
568e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mocked type must be: " + spiedInstance.getClass().getSimpleName() + ", but is: " + mockedType.getSimpleName(),
569e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  //correct spying:",
570e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  spy = mock( ->ArrayList.class<- , withSettings().spiedInstance( ->new ArrayList()<- );",
571e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  //incorrect - types don't match:",
572e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  spy = mock( ->List.class<- , withSettings().spiedInstance( ->new ArrayList()<- );"
573e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
574e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
575e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
576e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotCallRealMethodOnInterface() {
577e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
578e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Cannot call real method on java interface. Interface does not have any implementation!",
579e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Calling real methods is only possible when mocking concrete classes.",
580e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  //correct example:",
581e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  when(mockOfConcreteClass.doStuff()).thenCallRealMethod();"
582e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
583e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
584e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
585e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotVerifyToString() {
586e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
587e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mockito cannot verify toString()",
588e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "toString() is too often used behind of scenes  (i.e. during String concatenation, in IDE debugging views). " +
589e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        "Verifying it may give inconsistent or hard to understand results. " +
590e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        "Not to mention that verifying toString() most likely hints awkward design (hard to explain in a short exception message. Trust me...)",
591e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "However, it is possible to stub toString(). Stubbing toString() smells a bit funny but there are rare, legitimate use cases."
592e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
593e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
594e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
595e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void moreThanOneAnnotationNotAllowed(String fieldName) {
596e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException("You cannot have more than one Mockito annotation on a field!\n" +
597e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "The field '" + fieldName + "' has multiple Mockito annotations.\n" +
598e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "For info how to use annotations see examples in javadoc for MockitoAnnotations class.");
599e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
600e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
601e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void unsupportedCombinationOfAnnotations(String undesiredAnnotationOne, String undesiredAnnotationTwo) {
602e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException("This combination of annotations is not permitted on a single field:\n" +
603e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "@" + undesiredAnnotationOne + " and @" + undesiredAnnotationTwo);
604e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
605e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
606e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotInitializeForSpyAnnotation(String fieldName, Exception details) {
607e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join("Cannot instantiate a @Spy for '" + fieldName + "' field.",
608e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You haven't provided the instance for spying at field declaration so I tried to construct the instance.",
609e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "However, I failed because: " + details.getMessage(),
610e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct usage of @Spy:",
611e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   @Spy List mock = new LinkedList();",
612e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   @Spy Foo foo; //only if Foo has parameterless constructor",
613e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   //also, don't forget about MockitoAnnotations.initMocks();",
614e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""), details);
615e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
616e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
617e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotInitializeForInjectMocksAnnotation(String fieldName, Exception details) {
618e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join("Cannot instantiate @InjectMocks field named '" + fieldName + "'.",
619e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You haven't provided the instance at field declaration so I tried to construct the instance.",
620e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "However, I failed because: " + details.getMessage(),
621e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Examples of correct usage of @InjectMocks:",
622e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   @InjectMocks Service service = new Service();",
623e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   @InjectMocks Service service;",
624e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   //also, don't forget about MockitoAnnotations.initMocks();",
625e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   //and... don't forget about some @Mocks for injection :)",
626e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""), details);
627e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
628e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
629e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void atMostShouldNotBeUsedWithTimeout() {
630e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new FriendlyReminderException(join("",
631e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Don't panic! I'm just a friendly reminder!",
632e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "timeout() should not be used with atMost() because...",
633e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "...it does not make much sense - the test would have passed immediately in concurency",
634e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "We kept this method only to avoid compilation errors when upgrading Mockito.",
635e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "In future release we will remove timeout(x).atMost(y) from the API.",
636e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "If you want to find out more please refer to issue 235",
637e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""));
638e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
639e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
640e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void fieldInitialisationThrewException(Field field, Throwable details) {
641e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
642e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Cannot instantiate @InjectMocks field named '" + field.getName() + "' of type '" + field.getType() +  "'.",
643e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You haven't provided the instance at field declaration so I tried to construct the instance.",
644e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "However the constructor or the initialization block threw an exception : " + details.getMessage(),
645e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""), details);
646e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
647e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
648e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
649e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void invocationListenerDoesNotAcceptNullParameters() {
650e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException("invocationListeners() does not accept null parameters");
651e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
652e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
653e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void invocationListenersRequiresAtLeastOneListener() {
654e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException("invocationListeners() requires at least one listener");
655e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
656e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
657e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void invocationListenerThrewException(InvocationListener listener, Throwable listenerThrowable) {
658e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(StringJoiner.join(
659e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "The invocation listener with type " + listener.getClass().getName(),
660e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "threw an exception : " + listenerThrowable.getClass().getName() + listenerThrowable.getMessage()), listenerThrowable);
661e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
662e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
663e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void cannotInjectDependency(Field field, Object matchingMock, Exception details) {
664e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
665e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mockito couldn't inject mock dependency '" + new MockUtil().getMockName(matchingMock) + "' on field ",
666e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "'" + field + "'",
667e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "whose type '" + field.getDeclaringClass().getCanonicalName() + "' was annotated by @InjectMocks in your test.",
668e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also I failed because: " + details.getCause().getMessage(),
669e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
670e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ), details);
671e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
672e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
673e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void mockedTypeIsInconsistentWithDelegatedInstanceType(Class mockedType, Object delegatedInstance) {
674e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
675e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mocked type must be the same as the type of your delegated instance.",
676e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Mocked type must be: " + delegatedInstance.getClass().getSimpleName() + ", but is: " + mockedType.getSimpleName(),
677e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  //correct delegate:",
678e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  spy = mock( ->List.class<- , withSettings().delegatedInstance( ->new ArrayList()<- );",
679e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  //incorrect - types don't match:",
680e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "  spy = mock( ->List.class<- , withSettings().delegatedInstance( ->new HashSet()<- );"
681e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
682e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
683e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
684e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void spyAndDelegateAreMutuallyExclusive() {
685e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
686e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Settings should not define a spy instance and a delegated instance at the same time."
687e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        )) ;
688e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
689e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
690e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void invalidArgumentRangeAtIdentityAnswerCreationTime() {
691e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join("Invalid argument index.",
692e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "The index need to be a positive number that indicates the position of the argument to return.",
693e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "However it is possible to use the -1 value to indicates that the last argument should be",
694e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "returned."));
695e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
696e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
697e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public int invalidArgumentPositionRangeAtInvocationTime(InvocationOnMock invocation, boolean willReturnLastParameter, int argumentIndex) {
698e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(
699e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                join("Invalid argument index for the current invocation of method : ",
700e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        " -> " + new MockUtil().getMockName(invocation.getMock()) + "." + invocation.getMethod().getName() + "()",
701e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        "",
702e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        (willReturnLastParameter ?
703e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                                "Last parameter wanted" :
704e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                                "Wanted parameter at position " + argumentIndex) + " but " + possibleArgumentTypesOf(invocation),
705e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        "The index need to be a positive number that indicates a valid position of the argument in the invocation.",
706e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        "However it is possible to use the -1 value to indicates that the last argument should be returned.",
707e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        ""));
708e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
709e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
710e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private StringBuilder possibleArgumentTypesOf(InvocationOnMock invocation) {
711e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Class<?>[] parameterTypes = invocation.getMethod().getParameterTypes();
712e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (parameterTypes.length == 0) {
713e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return new StringBuilder("the method has no arguments.\n");
714e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
715e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
716e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        StringBuilder stringBuilder = new StringBuilder("the possible argument indexes for this method are :\n");
717e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        for (int i = 0, parameterTypesLength = parameterTypes.length; i < parameterTypesLength; i++) {
718e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            stringBuilder.append("    [").append(i);
719e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
720e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            if (invocation.getMethod().isVarArgs() && i == parameterTypesLength - 1) {
721e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                stringBuilder.append("+] ").append(parameterTypes[i].getComponentType().getSimpleName()).append("  <- Vararg").append("\n");
722e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            } else {
723e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                stringBuilder.append("] ").append(parameterTypes[i].getSimpleName()).append("\n");
724e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
725e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
726e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return stringBuilder;
727e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
728e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
729e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void wrongTypeOfArgumentToReturn(InvocationOnMock invocation, String expectedType, Class actualType, int argumentIndex) {
730e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new WrongTypeOfReturnValue(join(
731e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "The argument of type '" + actualType.getSimpleName() + "' cannot be returned because the following ",
732e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "method should return the type '" + expectedType + "'",
733e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                " -> " + new MockUtil().getMockName(invocation.getMock()) + "." + invocation.getMethod().getName() + "()",
734e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
735e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "The reason for this error can be :",
736e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "1. The wanted argument position is incorrect.",
737e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "2. The answer is used on the wrong interaction.",
738e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
739e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Position of the wanted argument is " + argumentIndex + " and " + possibleArgumentTypesOf(invocation),
740e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "***",
741e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "However if you're still unsure why you're getting above error read on.",
742e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Due to the nature of the syntax above problem might occur because:",
743e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "1. This exception *might* occur in wrongly written multi-threaded tests.",
744e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   Please refer to Mockito FAQ on limitations of concurrency testing.",
745e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies - ",
746e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "   - with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.",
747e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
748e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
749e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
750e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
751e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void defaultAnswerDoesNotAcceptNullParameter() {
752e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException("defaultAnswer() does not accept null parameter");
753e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
754e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
755e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void serializableWontWorkForObjectsThatDontImplementSerializable(Class classToMock) {
756e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        throw new MockitoException(join(
757e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "You are using the setting 'withSettings().serializable()' however the type you are trying to mock '" + classToMock.getSimpleName() + "'",
758e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "do not implement Serializable AND do not have a no-arg constructor.",
759e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "This combination is requested, otherwise you will get an 'java.io.InvalidClassException' when the mock will be serialized",
760e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "",
761e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "Also note that as requested by the Java serialization specification, the whole hierarchy need to implements Serializable,",
762e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                "i.e. the top-most superclass has to implements Serializable.",
763e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                ""
764e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ));
765e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
766e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}
767