Home | History | Annotate | Download | only in framework
      1 package org.mockito.internal.framework;
      2 
      3 import org.junit.After;
      4 import org.junit.Test;
      5 import org.mockito.ArgumentMatchers;
      6 import org.mockito.MockSettings;
      7 import org.mockito.StateMaster;
      8 import org.mockito.exceptions.misusing.RedundantListenerException;
      9 import org.mockito.listeners.MockCreationListener;
     10 import org.mockito.listeners.MockitoListener;
     11 import org.mockito.mock.MockCreationSettings;
     12 import org.mockitoutil.TestBase;
     13 
     14 import java.util.List;
     15 import java.util.Set;
     16 
     17 import static org.mockito.ArgumentMatchers.any;
     18 import static org.mockito.Mockito.*;
     19 import static org.mockitoutil.ThrowableAssert.assertThat;
     20 
     21 public 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