/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.bugs; import org.junit.Test; import org.mockitoutil.TestBase; import static junit.framework.TestCase.assertEquals; import static org.mockito.Mockito.*; //see issue 101 public class CovariantOverrideTest extends TestBase { public interface ReturnsObject { Object callMe(); } public interface ReturnsString extends ReturnsObject { // Java 5 covariant override of method from parent interface String callMe(); } @Test public void returnFoo1() { ReturnsObject mock = mock(ReturnsObject.class); when(mock.callMe()).thenReturn("foo"); assertEquals("foo", mock.callMe()); // Passes } @Test public void returnFoo2() { ReturnsString mock = mock(ReturnsString.class); when(mock.callMe()).thenReturn("foo"); assertEquals("foo", mock.callMe()); // Passes } @Test public void returnFoo3() { ReturnsObject mock = mock(ReturnsString.class); when(mock.callMe()).thenReturn("foo"); assertEquals("foo", mock.callMe()); // Passes } @Test public void returnFoo4() { ReturnsString mock = mock(ReturnsString.class); mock.callMe(); // covariant override not generated ReturnsObject mock2 = mock; // Switch to base type to call covariant override verify(mock2).callMe(); // Fails: java.lang.AssertionError: expected:<foo> but was:<null> } }