/* * 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(); } }