blob: 0937b69992442ff75440c82ae3b97520103fae3a [file] [log] [blame]
/*
* Copyright (c) 2017 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.framework;
import org.junit.After;
import org.junit.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.MockSettings;
import org.mockito.StateMaster;
import org.mockito.exceptions.misusing.RedundantListenerException;
import org.mockito.listeners.MockCreationListener;
import org.mockito.listeners.MockitoListener;
import org.mockito.mock.MockCreationSettings;
import org.mockitoutil.TestBase;
import java.util.List;
import java.util.Set;
import static org.mockito.Mockito.*;
import static org.mockitoutil.ThrowableAssert.assertThat;
public class DefaultMockitoFrameworkTest extends TestBase {
private DefaultMockitoFramework framework = new DefaultMockitoFramework();
@After public void clearListeners() {
new StateMaster().clearMockitoListeners();
}
@Test(expected = IllegalArgumentException.class)
public void prevents_adding_null_listener() {
framework.addListener(null);
}
@Test(expected = IllegalArgumentException.class)
public void prevents_removing_null_listener() {
framework.removeListener(null);
}
@Test
public void ok_to_remove_unknown_listener() {
//it is safe to remove listener that was not added before
framework.removeListener(new MockitoListener() {});
}
@Test
public void ok_to_remove_listener_multiple_times() {
MockitoListener listener = new MockitoListener() {};
//when
framework.addListener(listener);
//then it is ok to:
framework.removeListener(listener);
framework.removeListener(listener);
}
@Test
public void adds_creation_listener() {
//given creation listener is added
MockCreationListener listener = mock(MockCreationListener.class);
framework.addListener(listener);
//when
MockSettings settings = withSettings().name("my list");
List mock = mock(List.class, settings);
Set mock2 = mock(Set.class);
//then
verify(listener).onMockCreated(eq(mock), any(MockCreationSettings.class));
verify(listener).onMockCreated(eq(mock2), any(MockCreationSettings.class));
verifyNoMoreInteractions(listener);
}
@SuppressWarnings({"CheckReturnValue", "MockitoUsage"})
@Test
public void removes_creation_listener() {
//given creation listener is added
MockCreationListener listener = mock(MockCreationListener.class);
framework.addListener(listener);
//and hooked up correctly
mock(List.class);
verify(listener).onMockCreated(ArgumentMatchers.any(), any(MockCreationSettings.class));
//when
framework.removeListener(listener);
mock(Set.class);
//then
verifyNoMoreInteractions(listener);
}
@Test public void prevents_duplicate_listeners_of_the_same_type() {
//given creation listener is added
framework.addListener(new MyListener());
assertThat(new Runnable() {
@Override
public void run() {
framework.addListener(new MyListener());
}
}) .throwsException(RedundantListenerException.class)
.throwsMessage("\n" +
"Problems adding Mockito listener.\n" +
"Listener of type 'MyListener' has already been added and not removed.\n" +
"It indicates that previous listener was not removed according to the API.\n" +
"When you add a listener, don't forget to remove the listener afterwards:\n" +
" Mockito.framework().removeListener(myListener);\n" +
"For more information, see the javadoc for RedundantListenerException class.");
}
private static class MyListener implements MockitoListener {}
}