blob: ae5edd5d30fd7f60137e9a27267b29ffd6b3d076 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitousage.basicapi;
import org.junit.Test;
import org.mockito.exceptions.base.MockitoException;
import org.mockitousage.IMethods;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.withSettings;
import static org.mockitoutil.ClassLoaders.inMemoryClassLoader;
import static org.mockitoutil.SimpleClassGenerator.makeMarkerInterface;
// See issue 453
public class MockingMultipleInterfacesTest {
class Foo {}
interface IFoo {}
interface IBar {}
@Test
public void should_allow_multiple_interfaces() {
//when
Foo mock = mock(Foo.class, withSettings().extraInterfaces(IFoo.class, IBar.class));
//then
assertThat(mock).isInstanceOf(IFoo.class);
assertThat(mock).isInstanceOf(IBar.class);
}
@Test
public void should_scream_when_null_passed_instead_of_an_interface() {
try {
//when
mock(Foo.class, withSettings().extraInterfaces(IFoo.class, null));
fail();
} catch (MockitoException e) {
//then
assertThat(e.getMessage()).contains("extraInterfaces() does not accept null parameters");
}
}
@Test
public void should_scream_when_no_args_passed() {
try {
//when
mock(Foo.class, withSettings().extraInterfaces());
fail();
} catch (MockitoException e) {
//then
assertThat(e.getMessage()).contains("extraInterfaces() requires at least one interface");
}
}
@Test
public void should_scream_when_null_passed_instead_of_an_array() {
try {
//when
mock(Foo.class, withSettings().extraInterfaces((Class[]) null));
fail();
} catch (MockitoException e) {
//then
assertThat(e.getMessage()).contains("extraInterfaces() requires at least one interface");
}
}
@Test
public void should_scream_when_non_interface_passed() {
try {
//when
mock(Foo.class, withSettings().extraInterfaces(Foo.class));
fail();
} catch (MockitoException e) {
//then
assertThat(e.getMessage()).contains("Foo which is not an interface");
}
}
@Test
public void should_scream_when_the_same_interfaces_passed() {
try {
//when
mock(IMethods.class, withSettings().extraInterfaces(IMethods.class));
fail();
} catch (MockitoException e) {
//then
assertThat(e.getMessage()).contains("You mocked following type: IMethods");
}
}
@Test
public void should_mock_class_with_interfaces_of_different_class_loader_AND_different_classpaths() throws ClassNotFoundException {
// Note : if classes are in the same classpath, SearchingClassLoader can find the class/classes and load them in the first matching classloader
Class<?> interface1 = inMemoryClassLoader()
.withClassDefinition("test.Interface1", makeMarkerInterface("test.Interface1"))
.build()
.loadClass("test.Interface1");
Class<?> interface2 = inMemoryClassLoader()
.withClassDefinition("test.Interface2", makeMarkerInterface("test.Interface2"))
.build()
.loadClass("test.Interface2");
Object mocked = mock(interface1, withSettings().extraInterfaces(interface2));
assertThat(interface2.isInstance(mocked)).describedAs("mock should be assignable from interface2 type").isTrue();
}
}