DefaultMockitoFrameworkTest.java revision 2637d96c202372854a7c71466ddcc6e90fc4fc53
1package org.mockito.internal.framework;
2
3import org.junit.After;
4import org.junit.Test;
5import org.mockito.ArgumentMatchers;
6import org.mockito.MockSettings;
7import org.mockito.StateMaster;
8import org.mockito.exceptions.misusing.RedundantListenerException;
9import org.mockito.listeners.MockCreationListener;
10import org.mockito.listeners.MockitoListener;
11import org.mockito.mock.MockCreationSettings;
12import org.mockitoutil.TestBase;
13
14import java.util.List;
15import java.util.Set;
16
17import static org.mockito.ArgumentMatchers.any;
18import static org.mockito.Mockito.*;
19import static org.mockitoutil.ThrowableAssert.assertThat;
20
21public class DefaultMockitoFrameworkTest extends TestBase {
22
23    private DefaultMockitoFramework framework = new DefaultMockitoFramework();
24
25    @After public void clearListeners() {
26        new StateMaster().clearMockitoListeners();
27    }
28
29    @Test(expected = IllegalArgumentException.class)
30    public void prevents_adding_null_listener() {
31        framework.addListener(null);
32    }
33
34    @Test(expected = IllegalArgumentException.class)
35    public void prevents_removing_null_listener() {
36        framework.removeListener(null);
37    }
38
39    @Test
40    public void ok_to_remove_unknown_listener() {
41        //it is safe to remove listener that was not added before
42        framework.removeListener(new MockitoListener() {});
43    }
44
45    @Test
46    public void ok_to_remove_listener_multiple_times() {
47        MockitoListener listener = new MockitoListener() {};
48
49        //when
50        framework.addListener(listener);
51
52        //then it is ok to:
53        framework.removeListener(listener);
54        framework.removeListener(listener);
55    }
56
57    @Test
58    public void adds_creation_listener() {
59        //given creation listener is added
60        MockCreationListener listener = mock(MockCreationListener.class);
61        framework.addListener(listener);
62
63        //when
64        MockSettings settings = withSettings().name("my list");
65        List mock = mock(List.class, settings);
66        Set mock2 = mock(Set.class);
67
68        //then
69        verify(listener).onMockCreated(eq(mock), any(MockCreationSettings.class));
70        verify(listener).onMockCreated(eq(mock2), any(MockCreationSettings.class));
71        verifyNoMoreInteractions(listener);
72    }
73
74    @Test
75    public void removes_creation_listener() {
76        //given creation listener is added
77        MockCreationListener listener = mock(MockCreationListener.class);
78        framework.addListener(listener);
79
80        //and hooked up correctly
81        mock(List.class);
82        verify(listener).onMockCreated(ArgumentMatchers.any(), any(MockCreationSettings.class));
83
84        //when
85        framework.removeListener(listener);
86        mock(Set.class);
87
88        //then
89        verifyNoMoreInteractions(listener);
90    }
91
92    @Test public void prevents_duplicate_listeners_of_the_same_type() {
93        //given creation listener is added
94        framework.addListener(new MyListener());
95
96        assertThat(new Runnable() {
97            @Override
98            public void run() {
99                framework.addListener(new MyListener());
100            }
101        })  .throwsException(RedundantListenerException.class)
102            .throwsMessage("\n" +
103                    "Problems adding Mockito listener.\n" +
104                    "Listener of type 'MyListener' has already been added and not removed.\n" +
105                    "It indicates that previous listener was not removed according to the API.\n" +
106                    "When you add a listener, don't forget to remove the listener afterwards:\n" +
107                    "  Mockito.framework().removeListener(myListener);\n" +
108                    "For more information, see the javadoc for RedundantListenerException class.");
109    }
110
111    private static class MyListener implements MockitoListener {}
112}
113