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 Parkinsonpackage org.mockito;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.listeners.InvocationListener;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.mock.MockCreationSettings;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.stubbing.Answer;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.io.Serializable;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Allows mock creation with additional mock settings.
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p/>
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Don't use it too often.
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Consider writing simple tests that use simple mocks.
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Repeat after me: simple tests push simple, KISSy, readable & maintainable code.
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * If you cannot write a test in a simple way - refactor the code under test.
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p/>
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Examples of mock settings:
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <pre class="code"><code class="java">
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   //Creates mock with different default answer & name
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   Foo mock = mock(Foo.class, withSettings()
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *                                .defaultAnswer(RETURNS_SMART_NULLS)
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *                                .name("cool mockie")
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *                                );
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   //Creates mock with different default answer, descriptive name and extra interfaces
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   Foo mock = mock(Foo.class, withSettings()
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *                                .defaultAnswer(RETURNS_SMART_NULLS)
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *                                .name("cool mockie")
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *                                .extraInterfaces(Bar.class));
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </code></pre>
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * {@link MockSettings} has been introduced for two reasons.
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Firstly, to make it easy to add another mock setting when the demand comes.
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Secondly, to enable combining together different mock settings without introducing zillions of overloaded mock() methods.
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic interface MockSettings extends Serializable {
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Specifies extra interfaces the mock should implement. Might be useful for legacy code or some corner cases.
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * For background, see issue 51 <a href="http://code.google.com/p/mockito/issues/detail?id=51">here</a>
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * This mysterious feature should be used very occasionally.
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * The object under test should know exactly its collaborators & dependencies.
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * If you happen to use it often than please make sure you are really producing simple, clean & readable code.
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Examples:
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo foo = mock(Foo.class, withSettings().extraInterfaces(Bar.class, Baz.class));
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   //now, the mock implements extra interfaces, so following casting is possible:
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Bar bar = (Bar) foo;
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Baz baz = (Baz) foo;
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param interfaces extra interfaces the should implement.
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings extraInterfaces(Class<?>... interfaces);
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Specifies mock name. Naming mocks can be helpful for debugging - the name is used in all verification errors.
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Beware that naming mocks is not a solution for complex code which uses too many mocks or collaborators.
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <b>If you have too many mocks then refactor the code</b> so that it's easy to test/debug without necessity of naming mocks.
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <b>If you use &#064;Mock annotation then you've got naming mocks for free!</b> &#064;Mock uses field name as mock name. {@link Mock Read more.}
70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Examples:
72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo foo = mock(Foo.class, withSettings().name("foo"));
74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   //Below does exactly the same:
76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo foo = mock(Foo.class, "foo");
77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param name the name of the mock, later used in all verification errors
79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
80e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
81e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings name(String name);
82e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
83e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
84e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Specifies the instance to spy on. Makes sense only for spies/partial mocks.
85e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
86e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Sets the instance that will be spied. Actually copies the internal fields of the passed instance to the mock.
87e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
88e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * As usual you are going to read <b>the partial mock warning</b>:
89e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Object oriented programming is more or less about tackling complexity by dividing the complexity into separate, specific, SRPy objects.
90e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * How does partial mock fit into this paradigm? Well, it just doesn't...
91e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Partial mock usually means that the complexity has been moved to a different method on the same object.
92e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * In most cases, this is not the way you want to design your application.
93e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
94e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * However, there are rare cases when partial mocks come handy:
95e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * dealing with code you cannot change easily (3rd party interfaces, interim refactoring of legacy code etc.)
96e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * However, I wouldn't use partial mocks for new, test-driven & well-designed code.
97e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
98e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Enough warnings about partial mocks, see an example how spiedInstance() works:
99e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
100e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo foo = mock(Foo.class, withSettings().spiedInstance(fooInstance));
101e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
102e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   //Below does exactly the same:
103e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo foo = spy(fooInstance);
104e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
105e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
106e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * About stubbing for a partial mock, as it is a spy it will always call the real method, unless you use the
107e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <code>doReturn</code>|<code>Throw</code>|<code>Answer</code>|<code>CallRealMethod</code> stubbing style. Example:
108e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
109e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
110e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   List list = new LinkedList();
111e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   List spy = spy(list);
112e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
113e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   //Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
114e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   when(spy.get(0)).thenReturn("foo");
115e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
116e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   //You have to use doReturn() for stubbing
117e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   doReturn("foo").when(spy).get(0);
118e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code>
119e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
120e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param instance to spy on
121e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
122e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
123e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings spiedInstance(Object instance);
124e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
125e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
126e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Specifies default answers to interactions.
127e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * It's quite advanced feature and typically you don't need it to write decent tests.
128e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * However it can be helpful when working with legacy systems.
129e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
130e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * It is the default answer so it will be used <b>only when you don't</b> stub the method call.
131e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
132e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
133e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo mock = mock(Foo.class, withSettings().defaultAnswer(RETURNS_SMART_NULLS));
134e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo mockTwo = mock(Foo.class, withSettings().defaultAnswer(new YourOwnAnswer()));
135e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
136e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   //Below does exactly the same:
137e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   Foo mockTwo = mock(Foo.class, new YourOwnAnswer());
138e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
139e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
140e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param defaultAnswer default answer to be used by mock when not stubbed
141e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
142e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
143e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    @SuppressWarnings("unchecked")
144e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings defaultAnswer(Answer defaultAnswer);
145e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
146e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
147e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Configures the mock to be serializable. With this feature you can use a mock in a place that requires dependencies to be serializable.
148e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
149e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * WARNING: This should be rarely used in unit testing.
150e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
151e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * The behaviour was implemented for a specific use case of a BDD spec that had an unreliable external dependency.  This
152e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * was in a web environment and the objects from the external dependency were being serialized to pass between layers.
153e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
154e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Example:
155e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
156e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *   List serializableMock = mock(List.class, withSettings().serializable());
157e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
158e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
159e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
160e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @since 1.8.1
161e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
162e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings serializable();
163e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
164e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
165e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Enables real-time logging of method invocations on this mock. Can be used
166e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * during test debugging in order to find wrong interactions with this mock.
167e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
168e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Invocations are logged as they happen to the standard output stream.
169e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
170e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Calling this method multiple times makes no difference.
171e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
172e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Example:
173e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
174e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * List mockWithLogger = mock(List.class, withSettings().verboseLogging());
175e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
176e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
177e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
178e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
179e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings verboseLogging();
180e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
181e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
182e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Registers a listener for method invocations on this mock. The listener is
183e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * notified every time a method on this mock is called.
184e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
185e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Multiple listeners may be added, but the same object is only added once.
186e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * The order, in which the listeners are added, is not guaranteed to be the
187e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * order in which the listeners are notified.
188e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
189e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Example:
190e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
191e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *  List mockWithListener = mock(List.class, withSettings().invocationListeners(new YourInvocationListener()));
192e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
193e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
194e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * See the {@link InvocationListener listener interface} for more details.
195e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
196e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param listeners The invocation listeners to add. May not be null.
197e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
198e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
199e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings invocationListeners(InvocationListener... listeners);
200e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
201e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
202e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Sets whether this mock should only provide stubbing of methods.
203e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * A stub-only mock does not record method
204e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * invocations, thus saving memory but
205e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * disallowing verification of invocations.
206e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p>
207e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Example:
208e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <pre class="code"><code class="java">
209e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * List stubOnly = mock(List.class, withSettings().stubOnly());
210e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * </code></pre>
211e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
212e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return settings instance so that you can fluently specify other settings
213e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
214e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    MockSettings stubOnly();}
215