• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2007 Mockito contributors
3  * This program is made available under the terms of the MIT License.
4  */
5 
6 package org.mockitousage.puzzlers;
7 
8 import org.assertj.core.api.Assertions;
9 import org.junit.Test;
10 import org.mockitoutil.TestBase;
11 
12 import static junit.framework.TestCase.assertEquals;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.verify;
15 import static org.mockitoutil.Conditions.bridgeMethod;
16 
17 /**
18  * Bridge method is generated by compiler when erasure in parent class is
19  * different. When is different then it means that in runtime we will have
20  * overloading rather than overridding Therefore the compiler generates bridge
21  * method in Subclass so that erasures are the same, signatures of methods match
22  * and overridding is ON.
23  */
24 @SuppressWarnings("unchecked")
25 public class BridgeMethodPuzzleTest extends TestBase {
26 
27     private class Super<T> {
say(T t)28         public String say(T t) {
29             return "Super says: " + t;
30         }
31     }
32 
33     private class Sub extends Super<String> {
34         @Override
say(String t)35         public String say(String t)  {
36             return "Dummy says: " + t;
37         }
38     }
39 
40     @Test
shouldHaveBridgeMethod()41     public void shouldHaveBridgeMethod() throws Exception {
42         Super s = new Sub();
43 
44         assertEquals("Dummy says: Hello", s.say("Hello"));
45 
46         Assertions.assertThat(Sub.class).has(bridgeMethod("say"));
47         Assertions.assertThat(s).has(bridgeMethod("say"));
48     }
49 
50     @Test
shouldVerifyCorrectlyWhenBridgeMethodCalled()51     public void shouldVerifyCorrectlyWhenBridgeMethodCalled() throws Exception {
52         //Super has following erasure: say(Object) which differs from Dummy.say(String)
53         //mock has to detect it and do the super.say()
54         Sub s = mock(Sub.class);
55         Super<String> s_down = s;
56         s_down.say("Hello");
57 
58         verify(s).say("Hello");
59     }
60 
61     @Test
shouldVerifyCorrectlyWhenBridgeMethodVerified()62     public void shouldVerifyCorrectlyWhenBridgeMethodVerified() throws Exception {
63         //Super has following erasure: say(Object) which differs from Dummy.say(String)
64         //mock has to detect it and do the super.say()
65         Sub s = mock(Sub.class);
66         Super<String> s_down = s;
67         s.say("Hello");
68 
69         verify(s_down).say("Hello");
70     }
71 }
72