/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.puzzlers; import org.assertj.core.api.Assertions; import org.junit.Test; import org.mockitoutil.TestBase; import static junit.framework.TestCase.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockitoutil.Conditions.bridgeMethod; /** * Bridge method is generated by compiler when erasure in parent class is * different. When is different then it means that in runtime we will have * overloading rather than overridding Therefore the compiler generates bridge * method in Subclass so that erasures are the same, signatures of methods match * and overridding is ON. */ @SuppressWarnings("unchecked") public class BridgeMethodPuzzleTest extends TestBase { private class Super<T> { public String say(T t) { return "Super says: " + t; } } private class Sub extends Super<String> { @Override public String say(String t) { return "Dummy says: " + t; } } @Test public void shouldHaveBridgeMethod() throws Exception { Super s = new Sub(); assertEquals("Dummy says: Hello", s.say("Hello")); Assertions.assertThat(Sub.class).has(bridgeMethod("say")); Assertions.assertThat(s).has(bridgeMethod("say")); } @Test public void shouldVerifyCorrectlyWhenBridgeMethodCalled() throws Exception { //Super has following erasure: say(Object) which differs from Dummy.say(String) //mock has to detect it and do the super.say() Sub s = mock(Sub.class); Super<String> s_down = s; s_down.say("Hello"); verify(s).say("Hello"); } @Test public void shouldVerifyCorrectlyWhenBridgeMethodVerified() throws Exception { //Super has following erasure: say(Object) which differs from Dummy.say(String) //mock has to detect it and do the super.say() Sub s = mock(Sub.class); Super<String> s_down = s; s.say("Hello"); verify(s_down).say("Hello"); } }